3

私はviewControllerにいます。これをvcAと呼び、次を使用して2番目のvcBを呼び出します

[self presentModalViewController:vcB animated:YES];

vcB がロードされたら、vcA への参照を取得する方法はありますか?

はい、vcB をサブクラス化し、それにプロパティを追加できることはわかっています。ネイティブのiOSメソッド/プロパティ/すでにそれを行っているものがあるかどうかを尋ねているだけです。

私は、navigationController アプリを使用しています。

ありがとう。

4

3 に答える 3

5

単発使用で、コラボレーションがあまりない場合は、少し整理されているように見えるので、委任よりもブロックを好む傾向があります。

たとえば、secondViewControllerの使用が終了したときにコールバックするだけの場合は、次のようにします。

SecondViewControllerにブロックプロパティを追加します

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

次に、secondViewControllerを作成するときにfirstViewControllerで

- (void)showSecondViewController;
{
  SecondViewController *viewController = [[SecondViewController alloc] init];
  viewController.onCompletion = ^{
    [self dismissViewControllerAnimated:YES completion:nil];
  };

  [self presentViewController:viewController
                 animated:YES
               completion:nil];
}

次に、終了したらsecondViewControllerで

- (IBAction)doneTapped;
{
  if (self.onCompletion) {
    self.onCompletion();
  }
}

戻り値が必要な場合は、引数を受け入れるようにブロックを変更するだけです

于 2012-10-06T21:19:23.817 に答える
2

If your deployment target is iOS 5 or later, perhaps the presentingViewController property will give you what you need.

If your deployment target is iOS 4, you might get what you need from the parentViewController property.

Otherwise, you need to define your own property.

于 2012-10-06T19:46:35.450 に答える
1

委任を使用することをお勧めします。vcBでプロパティを宣言し、vcAをデリゲートとして設定します。このようにして、さまざまな状態の変化を現在のUIViewControllerに伝達できます。

最初にプロトコル宣言を行い、デリゲートプロパティを宣言します。

// ViewControllerB.h

@class ViewControllerB;

@protocol ViewControllerBDelegate <NSObject>
- (void)viewControllerDidClose:(ViewControllerB *)viewController;
@end

@property (unsafe_unretained, nonatomic) id<ViewControllerBDelegate> delegate;

次に、特定のイベントが発生したときにデリゲートを呼び出します。受信オブジェクトがプロトコルを実装していることを確認してください。

// ViewControllerB.m

- (IBAction)closeButtonTapped:(id)sender 
{
    if ([self.delegate respondsToSelector:@selector(viewControllerDidClose:)]) {
        [self.delegate viewControllerDidClose:self];
    }
}

次に、プロトコルをvcAに実装します。

// ViewControllerA.h

@interface ViewControllerA : UIViewController <ViewControllerBDelegate>

vcAをvcBのデリゲートとして設定します。

// ViewControllerA.m

- (void)presentVcB {
    vcB = [[ViewControllerB alloc] initWithNibName:nil bundle:nil];
    vcB.delegate = self;
    [self presentModalViewController:vcB animated:YES];
}

そして、メソッドが呼び出されたときにそれに応じて応答します。

// Implementing ViewControllerBDelegate
- viewControllerDidClose:(ViewControllerB *)viewController {
    [self dismissModalViewControllerAnimated:YES];
}

このパターンは、モーダルビューを閉じるだけでなく、さまざまな目的に使用できることに注意してください。

于 2012-10-06T20:30:03.857 に答える