Objective-Cので匿名デリゲートの実装?
-
12-09-2019 - |
質問
これは、Objective-Cで代表団のようなものの匿名の実装を宣言することは可能です。私は右の用語を持っていると思うが、ここではJavaの例です:
myClass.addListener(new FancyInterfaceListener({
void onListenerInterestingAction(Action a){
....interesting stuff here
}
});
UIActionSheetコールを処理するために、例えば、私はグローバル変数としてそのデータを保存する必要があると思いますので、私はそれにデータを渡したい場合は少し愚か思われる、同じクラスの別のメソッドを宣言する必要がありそう。
:ここにあなたの確かどうかを尋ねる確認ダイアログで何かを削除する例を示します。-(void)deleteItem:(int)indexToDelete{
UIActionSheet *confirm = [[UIActionSheet alloc] initWithTitle:@"Delete Item?" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:nil];
[confirm showInView:self.view];
[confirm release];
}
と同じクラスでUIActionSheetDelegateます:
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0){
[[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/];
[drinksTable reloadData];
}
}
私は何をすることができるようにしたいことは、私が一番上にJavaの例で行ったよう、インラインそれを宣言しています。これは可能でしょうか?
解決
現在のObjective-Cでこれを行う方法はありません。 Appleは言語に(本当に多くの匿名クラスよりもラムダ閉鎖などの)ブロックを追加するための努力にいくつかの作品を公開しています。あなたは可能性が高いものと匿名デリゲートに似た何かをすることができるだろう。
平均時間では、ほとんどのCocoaプログラマはデリゲートクラスの別のカテゴリにデリゲートメソッドを追加します。これは、より組織コードを維持するのに役立ちます。あなたの例では、クラスのための.mファイルでは、私はこのような何かをするでしょう。
@interface MyClass (UIActionSheetDelegate)
- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex;
@end
@implementation MyClass
//... normal stuff here
@end
@implementation MyClass (UIActionSheetDelegate)
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0){
[[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/];
[drinksTable reloadData];
}
}
@end
エディタウィンドウ内のXcodeのメソッドポップアップがメインクラスからカテゴリの宣言と実装を分離します。
他のヒント
のObjective-Cは、Javaのような匿名クラスの概念を持っていないので、あなたはJavaコードのように、クラス「インライン」を作成することはできません。
私はこの出くわしたとき、私は別の何かを探していましたが、あなたはUIALERTVIEW + BLOCKSの検索を行う場合は、インラインUIALERTVIEWsを行うためのいくつかのヒットがあります。これは私が使用してきたものです: ALERTVIEWワットブロック/ A>
私は、匿名クラスはObjective-Cで実装することができると信じているが、それはNSProxy
魔法とIMP
の狂気の多くがかかります。これは私の現在のプロジェクトの一つである。
どのようにデリゲートインターフェースを実装したクラスについて。 初期設定では、ブロックを取るでしょう。デリゲートの定義では、このブロックを呼び出します。
これは、複数UIActionSheetsが同一に比較することなく、同時に存在することができます。