2

私はこのタイトルに対する答えを見つけました、そして私は少し研究をしました、しかし私はまだ流れを得ていません。これが私がしたいことです:

1)プレゼンタービューのボタンをクリックして、モーダルビューを開きます。2)値を取得し、ボタンをクリックしてモーダルビューを閉じます。値をプレゼンタービューに送信し、メソッドを実行します。

これはコールバックのように機能しますが、それでもコールバックのものをどこに置くかがわかりません。

だから、私はこれをどのように正確に行うのですか?A)presentViewController完了ブロックに、モーダルビューが完了したときに実行するプレゼンタービューメソッドを含める必要がありますか?

または:B)モーダルビューのdismissViewControllerAnimated完了ブロックに、モーダルビューが完了したときに実行するプレゼンタービューメソッドを含める必要がありますか?

誰かがサンプルコードを手伝ってくれますか?または、少なくともコードを配置するブロックのフローを取得するのに役立ちますか?

ありがとう、P

4

3 に答える 3

9

あなたは完了ブロックについて話しているので、デリゲートを使用したくないと思います。

モーダルで表示されるviewControllerで、パブリック完了ハンドラーを提供する必要があります。これは、閉じられたときに呼び出されます。

@interface PresentedViewController : UIViewController

@property (nonatomic, strong) void (^onCompletion)(id result);

@end

次に、実装では、却下時にこの完了ブロックを呼び出す必要があります。ここでは、ボタンをクリックするとviewControllerが閉じられると仮定します

- (IBAction)done:(id)sender
{
  if (self.onCompletion) {
    self.onCompletion(self.someRetrievedValue);
  }
}

ここで、モーダルを提示したviewControllerに戻り、実際の完了ブロックを提供する必要があります。通常は、viewControllerを作成するときに

- (IBAction)showModal;
{
  PresentedViewController *controller = [[PresentedViewController alloc] init];
  controller.onCompletion = ^(id result) {
    [self doSomethingWithTheResult:result]
    [self dismissViewControllerAnimated:YES completion:nil];
  }
  [self presentViewController:controller animated:YES completion:nil];
}

これにより、モーダルで表示される新しいviewControllerが作成され、完了時に何が発生する必要があるかが定義されます。

于 2012-11-30T21:12:17.950 に答える
2

あなたはデリゲートでこれを行うことができます、それはAppleが推奨しているようですが、それは私にはやり過ぎのようです。presentingViewControllerプロパティを使用してプレゼンターへの参照があるため、ボタンクリックメソッドで提示されたコントローラーからプレゼンターのプロパティの値を設定できます。

self.presentingViewController.someProp = self.theValueToPass;
[self dismissViewControllerAnimated:YES];
于 2012-11-30T23:02:15.127 に答える
1

デリゲートを使用することは、これを処理するための良い方法です。

PresentedViewController.hで

@protocol PresentedViewControllerDelegate <NSObject>

-(void) viewWillDismiss;

@end

@property (nonatomic, weak) id <PresentedViewController> delegate;

次に、PresentingViewController.hで、このデリゲートをサブスクライブします

@interface PresentingViewController : UIViewController <PresentedViewControllerDelegate>

.mでは、デリゲートメソッドを実装する必要があります

- (void) viewWillDismiss {

}

ビューコントローラを表示する前に、作成したデリゲートプロパティを自分自身として設定します。

presentingViewController.delegate = self;

明らかに、すべての実装の詳細がここで行われているわけではありませんが、これで始めることができます。

于 2012-11-30T21:02:27.663 に答える