在UIView中存储其他相关信息

Moe*_*Moe 7 iphone xcode objective-c ios

我一直在阅读很多关于SO的手势识别器 - 并且设法编写了一个工作代码,当在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];
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,deleteImage:在这种情况下,向Selector发送信息有点棘手.我想在调用deleteImage时向服务器发送HTTP请求,因此我需要从视图中获取一些信息.

反正是否存储信息UIImageView并从中检索sender.view.myinfo(例如)?

谢谢!

nie*_*bot 20

通过扩展,您可以添加属性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) 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以在代码中的任何位置执行此操作

let anImageView = UIView()

// set your new property on any UIView:
anImageView.myInfo = <some object>

// get your proeprty from any UIView
myImage = anImageView.myInfo
Run Code Online (Sandbox Code Playgroud)

以前的答案(相同的代码,但在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
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

UIImage * myImage ;
myImage.myInfo = <some object>
Run Code Online (Sandbox Code Playgroud)


die*_*ikh 5

显而易见的方法是使用tag属性.如果您需要更多信息,可以随时继承UIImageView并添加额外的属性.