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];
    }
}

そのため、この状況でセレクターに情報を送信するの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 に答える
0

いいえ、imageView インスタンスに情報を保持することはできません。imageView の書き込み可能な文字列プロパティが見つかったとしても、これは間違ったアプローチになります。代わりにこれを行います: 順序番号を imegeview.tag プロパティに割り当て、情報用に NSMutableDictionary を保持します。したがって、キーとして使用する imageView.tag と情報が値になります。

于 2012-07-21T18:06:31.983 に答える