将附加的相关信息存储在UIView中
我一直在阅读关于手势识别器的很多内容,并设法编写一个工作代码,当在UIImage上识别一个长按时,会出现一个操作表:
{ ... UILongPressGestureRecognizer *longPressWall = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(deleteImage:)] autorelease]; longPressWall.minimumPressDuration = 0.4; l.userInteractionEnabled=YES; [l addGestureRecognizer:longPressWall]; ... } -(void)deleteImage:(UILongPressGestureRecognizer*)sender { if(UIGestureRecognizerStateBegan == sender.state) { UIActionSheet *as = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:@"Close" destructiveButtonTitle:@"Delete Screenshot" otherButtonTitles: nil]; [as showInView:masterView]; [as release]; } }
所以,发送信息给Selector deleteImage:
在这种情况下有点棘手。 我想在调用deleteImage时向服务器发送HTTP请求,所以我需要从视图中获取一些信息。
有反正存储信息到UIImageView
并从sender.view.myinfo
(例如)检索它?
谢谢!
显而易见的方法是使用标签属性。 如果你需要更多的信息,你总是可以inheritanceUIImageView并添加一个额外的属性。
通过扩展你可以添加一个属性到UIView
来存储你的关联值,如下所示:
import Foundation import ObjectiveC extension UIImageView { struct Static { static var key = "key" } var myInfo:AnyObject? { get { return objc_getAssociatedObject( self, &Static.key ) as AnyObject? } set { objc_setAssociatedObject( self, &Static.key, newValue, .OBJC_ASSOCIATION_RETAIN) } } }
现在,您可以在代码中的任何位置执行此操作
let anImageView = UIView() // set your new property on any UIView: anImageView.myInfo = <some object> // get your proeprty from any UIView myImage = anImageView.myInfo
以前的答案(相同的代码,但在Objective-C)检查objc_setAssociatedObject()
在<objc/runtime.h>
我会实现这个作为一个类别..(ARC风格)
#import <objc/runtime.h> @interface UIImageView (MyInfo) @property ( nonatomic, strong ) id myInfo ; @end @implementation UIImageView (MyInfo) -(void)setMyInfo:(id)info { objc_setAssociatedObject( self, "_myInfo", info, OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ; } -(id)myInfo { return objc_getAssociatedObject( self, "_myInfo" ) ; } @end
现在你可以做到这一点:
UIImage * myImage ; myImage.myInfo = <some object>
如果你想在你的UIImageView(或任何UIView)中存储一个string,请尝试以下方法 –
在您的视图中设置辅助function标识符,“l”
{ l.accessibilityIdentifier = @"your string here"; }
从您的手势识别器获取UIView“l”:
-(void)deleteImage:(UILongPressGestureRecognizer*)sender { if(UIGestureRecognizerStateBegan == sender.state) { UIView *view = sender.view; NSString *storedString = view.accessibilityIdentifier; } }
storedString是存储在你的UIView中的string。 希望这将有助于任何人在未来!
不,您无法将信息保存到imageView实例中。 即使你发现imageView的可写string属性,这将是一个错误的方法。 做这个,而不是:为imegeview.tag属性分配一个订单号,并为信息保留一个NSMutableDictionary,因此,您将使用的imageView.tag作为关键,信息将是价值。