[解決済み] Objective-Cでブロックを@selectorとして渡すことはできますか?
2023-04-10 10:46:16
質問
Objective-Cのブロックを
@selector
の引数に
UIButton
?すなわち、次のようにする方法はありますか?
[closeOverlayButton addTarget:self
action:^ {[anotherIvarLocalToThisMethod removeFromSuperview];}
forControlEvents:UIControlEventTouchUpInside];
ありがとうございます。
どのように解決するのですか?
はい、しかし、カテゴリを使用する必要があります。
のようなものです。
@interface UIControl (DDBlockActions)
- (void) addEventHandler:(void(^)(void))handler
forControlEvents:(UIControlEvents)controlEvents;
@end
実装は少し厄介でしょう。
#import <objc/runtime.h>
@interface DDBlockActionWrapper : NSObject
@property (nonatomic, copy) void (^blockAction)(void);
- (void) invokeBlock:(id)sender;
@end
@implementation DDBlockActionWrapper
@synthesize blockAction;
- (void) dealloc {
[self setBlockAction:nil];
[super dealloc];
}
- (void) invokeBlock:(id)sender {
[self blockAction]();
}
@end
@implementation UIControl (DDBlockActions)
static const char * UIControlDDBlockActions = "unique";
- (void) addEventHandler:(void(^)(void))handler
forControlEvents:(UIControlEvents)controlEvents {
NSMutableArray * blockActions =
objc_getAssociatedObject(self, &UIControlDDBlockActions);
if (blockActions == nil) {
blockActions = [NSMutableArray array];
objc_setAssociatedObject(self, &UIControlDDBlockActions,
blockActions, OBJC_ASSOCIATION_RETAIN);
}
DDBlockActionWrapper * target = [[DDBlockActionWrapper alloc] init];
[target setBlockAction:handler];
[blockActions addObject:target];
[self addTarget:target action:@selector(invokeBlock:) forControlEvents:controlEvents];
[target release];
}
@end
いくつかの説明があります。
-
というカスタム "内部専用" クラスを使用しています。
DDBlockActionWrapper
. これはブロックプロパティ (呼び出したいブロック) と、そのブロックを呼び出すだけのメソッドを持つ単純なクラスです。 -
は
UIControl
カテゴリは単にこれらのラッパーの一つをインスタンス化し、呼び出されるブロックを与え、そしてそのラッパーとそのinvokeBlock:
メソッドをターゲットとアクションとして使うように指示します (通常通り)。 -
は
UIControl
の配列を格納するために、関連するオブジェクトを使用します。DDBlockActionWrappers
というのはUIControl
はターゲットを保持しないためです。 この配列は、ブロックが呼び出されることになっているときに存在することを確認するためのものです。 -
はオブジェクトが破壊されたときにクリーンアップされるようにしなければなりません。DDBlockActionWrappers
を、関連するオブジェクトを削除する新しいものと交換し、それから元の-[UIControl dealloc]
のコードを実行します。 トリッキー、トリッキー。 実は に関連付けられたオブジェクトは、割り当て解除の際に自動的にクリーンアップされます。 .
最後に、このコードはブラウザで入力されたもので、コンパイルはされていません。 おそらく、いくつか間違っている部分があると思います。 あなたのマイレージは変わるかもしれません。
関連
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] IBOutletsはARCのもとで強くなるべきか、弱くなるべきか?
-
[解決済み] Objective-CでQueueを作成し、使用するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Objective-Cのセレクタ?
-
[解決済み] NSObject +loadと+initialize - これらは何をするのですか?
-
[解決済み] Objective-C の boolean の書式設定文字列?
-
[解決済み] キューに入れられたperformSelector:afterDelayの呼び出しをキャンセルする
-
[解決済み] IOSのUIViewからアプリケーションのドキュメントフォルダに画像を保存する
-
[解決済み] NSNumberのインクリメント方法
-
[解決済み] NSSetからNSMutableArrayを返す方法
-
[解決済み] NSIntegerをint型に変換するには?
-
[解決済み] Xcode 4(および依存関係)におけるコンパイル、ビルド、またはアーカイブの問題
-
[解決済み] Objective-CのクラスからSwiftの関数を呼び出す