25

Objective-C で Delegates などの匿名実装を宣言することは可能ですか? 用語は正しいと思いますが、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 の例で行ったように、インラインで宣言することです。これは可能ですか?

4

5 に答える 5

17

現在、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 のメソッド ポップアップは、カテゴリの宣言と実装をメイン クラスから分離します。

于 2009-04-20T16:09:22.507 に答える
4

Objective-C には Java のような無名クラスの概念がないため、Java コードのように「インライン」でクラスを作成することはできません。

于 2009-04-20T00:22:26.247 に答える
2

これに出くわしたとき、何か違うものを探していましたが、UIALERTVIEW+BLOCKS を検索すると、インライン UIALERTVIEW を実行するためのいくつかのヒットが見つかります。これは私が使用しているものです: ALERTVIEW w/blocks

于 2011-06-17T14:03:24.943 に答える
1

匿名クラスは Objective-C で実装できると思いますが、それには多くのNSProxy魔法とIMP狂気が必要です。これは私の現在のプロジェクトの 1 つです。

于 2009-12-01T00:03:14.320 に答える
0

デリゲート インターフェイスを実装するクラスはどうですか。初期化では、ブロックが必要です。デリゲート定義では、このブロックを呼び出します。

これにより、ID を比較することなく、複数の UIActionSheets を同時に存在させることができます。

于 2012-04-26T21:08:59.763 に答える