16

UIAlertView に userInfo オブジェクトまたは任意の NSDictionary を追加する方法を知りたいですか?

ありがとうございました。

4

5 に答える 5

31

UIAlertView をサブクラス化してフィールドを追加するか、代わりにデリゲート クラスに参照を格納してみてください。しかし、オブジェクトを他のオブジェクトにアタッチする最も一般的な方法は、 を使用することobjc_setAssociatedObjectです。

そのためには が#import <objc/runtime.h>必要であり、キーとして使用される任意の が必要ですvoid *(通常のトリックはstatic char fooKey;、.m ファイルで a を宣言し、そのアドレスを使用することです)。次に、次のようにオブジェクトをアタッチできます。

objc_setAssociatedObject(alertView, &fooKey, myDictionary, OBJC_ASSOCIATION_RETAIN);

この場合、myDictionary は alertView の存続期間中保持され、alertView の割り当てが解除されると解放されます。

関連付けられたオブジェクトを後で取得するには、論理的な名前の を使用しますobjc_getAssociatedObject

NSDictionary *myDictionary = objc_getAssociatedObject(alertView, &fooKey);

nilアソシエーション セットがない場合は返されます。関連付けを解除するにobjc_setAssociatedObjectは、同じオブジェクトとキーに新しい値を関連付けるために使用します。nil新しいオブジェクトを関連付けずに関連付けを解除するために使用できます。

OBJC_ASSOCIATION_RETAIN 以外のアソシエーションのタイプの値は、ここにリストされています。

于 2011-03-12T01:13:16.110 に答える
15

NSObjectすべてのオブジェクトにデータを簡単に保存する機能を提供する(十分にテストされた)カテゴリを作成しました。

コードをヘッダーと実装ファイルに入れて、任意のプロジェクトにインポートするだけです。または、静的ライブラリに入れます。Mac OS X 10.6+およびiOS(バージョン?)のみ。

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface NSObject (CCFoundation)

- (id)associativeObjectForKey: (NSString *)key;
- (void)setAssociativeObject: (id)object forKey: (NSString *)key;

@end

#pragma mark -

@implementation NSObject (CCFoundation)

static char associativeObjectsKey;

- (id)associativeObjectForKey: (NSString *)key {
    NSMutableDictionary *dict = objc_getAssociatedObject(self, &associativeObjectsKey);
    return [dict objectForKey: key];
}

- (void)setAssociativeObject: (id)object forKey: (NSString *)key {
    NSMutableDictionary *dict = objc_getAssociatedObject(self, &associativeObjectsKey);
    if (!dict) {
        dict = [[NSMutableDictionary alloc] init];
        objc_setAssociatedObject(self, &associativeObjectsKey, dict, OBJC_ASSOCIATION_RETAIN);
    } [dict setObject: object forKey: key];
}

@end

簡単に言えば、すべてのオブジェクトは、必要になるとすぐに使いやすい辞書になります(のおかげでNSMutableDictionary)。ディクショナリはオブジェクトがリリースされたときに解放され、ディクショナリのオブジェクトはディクショナリが解放されたときに解放されます。Appleがこれを簡単にしたのは驚くべきことです。

警告1:上記のコードはARC対応です。十分にテストされており、いくつかの出荷された製品で使用されています。メモリリークやパフォーマンスの問題はまだ見られませんでした。

警告2:必要に応じてメソッドの名前を変更しますが、名前を保持することを選択した場合は、必ずプレフィックスを追加してください。これは、ルートオブジェクトである人のカテゴリです。どこかのクラスがこのメソッド名を使用していて、干渉したくない!すべてのプロジェクトに含める静的ライブラリは、メソッド名associativeCCObjectForKey:とを使用しsetAssociativeCCObject:forKey:ます。

userInfoこれが、すべてのオブジェクトにシンプルな機能を持たせたい人に役立つことを願っています。どういたしまして!:-)

于 2012-04-25T15:45:21.500 に答える
4

静的文字を作成する代わりに、「キー」などのリテラルC文字列を指定すると機能します

代わりに、アノミーの言うことを考慮して、代わりにこれを行うことができます:

objc_setAssociatedObject ( alert , (const void*)0x314 , notification , OBJC_ASSOCIATION_RETAIN ) ;

これは、任意の void* を使用できるもの (観察、この関数など) に対して機能し、追加の静的変数のトリックは必要ありません。また、 (const void*)0x314 は、コンパイラが何をしても、常に 0x314 です。

また、アノミー、あなたは私が今取り組んでいるアプリで多くの作業を節約してくれました. ありがとう!

于 2011-08-08T23:33:56.817 に答える