7

我在 SO 上阅读了很多关于 Gesture Recognizers 的内容 - 并设法编写了一个工作代码,当在 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

4

4 回答 4

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) 
        }
    }
}

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

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>
于 2012-07-21T18:06:32.513 回答
5

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

于 2012-07-21T18:11:04.337 回答
1

如果您希望在 UIImageView (或任何 UIView )中存储字符串,请尝试以下操作 -

在您的视图中设置可访问性标识符,“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 中的字符串。希望这对将来的任何人都有帮助!

于 2015-02-15T21:14:23.017 回答
0

不,您不能将信息保存到 imageView 实例中。即使找到 imageView 的可写字符串属性,这也是错误的做法。改为这样做:为 imegeview.tag 属性分配一个订单号,并为信息保留一个 NSMutableDictionary,因此,您将使用 imageView.tag 作为键,而信息将是值。

于 2012-07-21T18:06:31.983 回答