0

iOS グリッド ビューに使用されるインターフェイス/プロトコルを作成しています。クラス内にできるだけ多くの情報をカプセル化しようとしており、クラスとそのサブクラスのユーザーにほとんど情報を残していません。コールバック メソッドまたはデリゲートがどうあるべきかで行き詰まっています。C または C++ では、タッチアップ イベントで呼び出されるメソッドのパラメーターとして関数ポインターを渡す必要がありました。Objective C (かなり新しいものです) では、ブロックとセレクターに困惑しています。私が見たところ、アップルの方法はセレクターを使用することです。したがって、このクラスでは、タッチアップ イベントが検出されたときに何が起こるかを示すセレクターとしてメソッドを設定する必要があります。大規模なサブクラス化は行いたくありません。これにより、再利用性が制限され、このインターフェイスが使用されるたびにより多くのコーディングが必要になるからです。限定コードも含めて、セレクターを使用してこれまでに行ったことを説明しますが、代わりにブロックを使用して同じことを行う方法と、それがなぜ優れているかについての提案をお待ちしています。私はこれをテストしていません。現在設計中です。

@protocol Grid <NSObject>
@required

/*! @brief Initializer for base class */
- (id) init:(UIView *)parent withSelector:(SEL)selector;
/*! @brief Draw the actual view */
- (void) draw:(CGRect) rect;
/*! @brief Reload the data */
- (void) reload;
@end

タイトルは誤解を招くものであり、この質問を投稿してから、Objective-C での動作についてよりよく理解できました。これは、セレクターをプロパティまたはデリゲートとして設定するのではなく、基本クラス、継承、およびポリモーフィズムを抽象化することに関するものです。

4

1 に答える 1

1

あなたがすべきことは、クラス (おそらくデリゲート) がプロトコルに準拠していることを要求することです。このようにできます。

@interface GridView : UIView {
    id<Grid> delegate;
}

...

@end

ユーザーにデリゲート プロパティを指定してもらいます。この時点で、デリゲートについてわかっていることは、デリゲートが Grid プロトコルに準拠していることだけです。そのため、デリゲートが必要なメソッドをすべて実装していることを確認できます。GridViewクラス ( ) が目的を完全に無効にする独自のデリゲートを割り当てる必要がないため、プロトコルにはいかなる種類の init メソッドも含めるべきではないことに注意してください。

デリゲートとして使用するクラスでは、デリゲートとしてGrid使用できるように、プロトコルに準拠していることを確認する必要があります。それはこのようになります。

@interface GridDelegateObject : NSObject <Grid> {
...
}

...

@end

また、少なくともGridプロトコルで必要なメソッドの実装を提供する必要があります。

次に、インスタンスのデリゲートを のGridViewインスタンスに設定する必要がありますGridDelegateObject

[gridViewInstance setDelegate:gridDelegateObjectInstance];

次に、このように、プロトコルからgridDelegateObject実装されたすべてのメソッドを から呼び出すことができます。GridgridViewInstance

-(void)someMethod {
    [delegate reload];
}

またはそのようなもの。でリロード関数を呼び出しますgridDelegateObjectInstance

于 2012-08-17T14:44:28.867 に答える