1

私は、ペイントのようにタップして描画するビューを持っているviewControllerを持っています。そのコントローラーには、画面をクリアする方法があります-

- (void) clearS
{
    [(TouchTrackerView *)self.view clear];
}

今、ボタンで画面を占有したくないので、別の画面にアプリケーションを開始位置にリセットするボタンがあり、画面をクリアしたいです。そのボタンは別のView Controllerに属しており、とりわけ、描画View Controllerを呼び出して、画面を消去するように依頼したいと考えています。したがって、描画ビューコントローラーで次のように通知を設定します。

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(clearS) name:@"clearScreen" object: nil];

そして、ボタンをクリックした場所からビューコントローラーで次のようにします。

 [[NSNotificationCenter defaultCenter] postNotificationName:@"clearScreen" object: nil];

私が理解しているように、ボタンがクリックされると、通知が投稿され、メソッドが呼び出されます。そして、それはクラッシュします。

[(TouchTrackerView *)self.view clear]

私が理解している問題は、メソッド呼び出しの瞬間に「自己」変数が非描画ビューコントローラーであり、それ自体のビューで明確なメソッドを実行しようとすることであり、それが欠けてクラッシュします。

メソッドを正しいView Controllerに送信するにはどうすればよいですか? 私の考えに欠陥はありますか?たぶん、これはより良い方法でアプローチできますか?

編集: 私は問題を発見しました、

[(TouchTrackerView *)self.view clear]

view を呼び出し、それが UIScrollView であり、clear メソッドをサポートしていません。したがって、正しいビューを含むプロパティを作成し、それを次のように変更しました

[(TouchTrackerView *)self.correctView clear]

そしてそれは魅力のように機能します。

たった 2 行のコードなので、通知を選択しました。私は初心者であり、デリゲートに頭を悩ませるのが難しいため、これをそのままにしておきます。特に機能することを確認します。

4

3 に答える 3

1

複数のオブジェクトが関心を持つ可能性のある情報をブロードキャストしようとしている場合を除き、通知は避けます。

より良いアプローチは、ペインティング ビュー コントローラーのデリゲート プロトコルを作成することです。

したがって、PaintingViewControllerDelegate プロトコルには次のようなメソッドが含まれる場合があります。

  • (void) paintingViewControllerWillClear:(PaintingViewController*)paintingViewController;
  • (void) paintingViewControllerDidClear:(PaintingViewController*)paintingViewController;

これで、ボタンを持つコントローラーが PaintingViewController のデリゲートになり、そのオブジェクトは必要に応じて PaintingViewControllerDelegate プロトコルのメソッドを提供します。

于 2013-01-12T16:19:03.233 に答える
1

本来一対多の通信方法である通知は、ここで使用するのには適していないと思います。より良いアプローチは、一方を他方のデリゲートとしてフックすることです->ボタンが押され、対応するIBActionが呼び出されると、デリゲート(あなたの場合、描画に使用するView Controller)はメッセージを取得し、何でも実行する必要がありますそれはそれがする必要があります。

于 2013-01-12T16:11:17.993 に答える
1

哲学的なレベルでは、通知をデリゲートパターン (または、より適切には、デリゲートプロトコルパターン) に置き換えることができるという他の人からの観察には同情しますが、これは 2 つのコントローラーが通信する適切な例ではないことに私は思います。お互いに直接。おそらく、MVCモデルを使用する必要があります。このモデルでは、編集ビュー コントローラーAが図面の編集用に設計されており (したがって、モデルを更新してビューを調整します)、リセット ビュー コントローラーBはモデルを更新/リセットするだけです。モデルの変更を通知する必要がある場合Aは、モデルとコントローラーの間にデリゲート プロトコル パターンを適用しますA。しかし、私は思わないBまったく通信する必要がありAます。

実用的なレベルでは、通知が正常に機能しない理由はまったくありません。残念ながら、あなたは私たちが質問に答えるのに十分な情報を共有していません. エラー メッセージの詳細をお知らせください。さらにサポートできる場合があります。

于 2013-01-12T16:56:20.487 に答える