在UIView中存储其他相关信息

时间:2012-07-21 17:59:57

标签: iphone objective-c ios xcode

我一直在阅读很多关于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];
    }
}

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

是否有将信息存储到UIImageView并从sender.view.myinfo检索(例如)?

谢谢!

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:5)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您希望在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中的字符串。希望这有助于未来的任何人!