将附加的相关信息存储在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作为关键,信息将是价值。