0

メッセージ作成ビューコントローラー(MFMessageComposeViewController)をMFMessageComposeViewControllerDelegate表示し、メッセージが送信/キャンセル/失敗したかどうかを確認するメソッドを処理できるようにするには、すべてのビューコントローラーが必要です。したがって、私のアイデアはUIViewController、このビューコントローラでこれらのメソッドをサブクラス化することでした。次に、メッセージを送信できるようにする必要があるすべてのビューコントローラーを上記のビューコントローラーにサブクラス化します。

以下のようなのでBaseMessageViewController : UIViewController

そしてViewController1 : BaseMessageViewControllerViewController2 : BaseMessageViewControllerなど...

それで、私がそれにいたとき、私は次のようなプロトコルを作成すると思いました:

@protocol MessageProcessing

@required

- (void)presentMessageCompose;
- (void)processMessageCancelled;
- (void)processMessageSent;
- (void)processMessageFailed;

@end

しかしBaseMessageViewController、このプロトコルに準拠する必要があるのか​​、それとも「具体的な」ビューコントローラがこのプロトコルに準拠する必要があるのか​​わかりません。

私がそれに準拠している場合、BaseMessageViewControllerクラスの継承のために、具体的なViewControllerが自動的に準拠するという考えがありました。ただし、具象ビューコントローラに、必要なメソッドが実装されていないという警告は表示されません。

誰かがここで私を助けてくれませんか:)

4

2 に答える 2

1

これらがBaseMessageViewController自分自身に送信するメッセージである場合、プロトコルを定義する理由はありません。でメソッドをBaseMessageViewController宣言し、宣言にコメントを付けて、いつ送信されるかを説明します。

BaseMessageViewControllerまた、コンパイラの警告を抑制するために、のメソッドの実装を提供する必要があります。すべてのサブクラスにメソッドを実装させたい場合は、次のBaseMessageViewControllerパターンを使用してメソッドを定義できます。

- (void)processMessageCancelled {
    [self doesNotRecognizeSelector:_cmd];
    abort();
}
于 2012-05-21T20:54:46.010 に答える
0

これは、抽象基本クラスプロトコルの質問の典型的な例です。

  • フレームワークを定義する場合は、抽象基本クラス(Cocoaではこれらはクラスクラスターと呼ばれます)を使用します。いくつかの一般的な懸念事項はフレームワークによってカプセル化され、いくつかの特定の懸念事項はサブクラスによって処理されます。例として、メッセージ解析フレームワークがあります。

  • プロトコルを使用して、独自のオブジェクト階層を必要とするクラスの共通コントラクトを定義します。たとえば、メディアプレーヤーの場合、「再生」と「停止」はメディアの種類によって完全に異なります。

あるいは、その中間の何かについては、JustinSpahr-summersがlibextobjcで「具体的なプロトコル」を定義します。。。https://github.com/jspahrsummers/libextobjc(Java 8の具象インターフェースに似ています)。

于 2013-08-02T03:41:07.203 に答える