8

次のようなカスタム コンテナー ビュー コントローラー (MainViewController) があるとします。

- (void)viewDidLoad
{
    [super viewDidLoad];        

    HomeViewController *homeVC = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
    [self addChildViewController:homeVC];
    [self.view addSubview:homeVC.view];

}

HomeViewController には「go」などのボタンがあり、これを押すと次のビュー コントローラに進む必要があります。したがって、このアクションを MainViewController に通知する必要があります。これを行う最善の方法は何ですか?

ビュー コントローラー間でカスタム トランジションを行う必要があるため、カスタム コンテナーを使用しています。「go」を押すと、HomeViewController のビューの一部がアニメーション化され、新しいビュー コントローラーのビューが所定の位置にアニメーション化されます。

明らかに、HomeViewController に MainViewController 型のプロパティを指定して、そのように呼び出すこともできますが、コンテナー ビュー コントローラー API を使用したよりクリーンな方法があることを願っています。

4

3 に答える 3

15

デリゲートまたはブロックのいずれかを使用できます。

デリゲートの使用

プロトコルを作成します:

@protocol SomeProtocol <NSObject>
- (void)someAction; 
@end 

次のように HomeViewController.h でデリゲートを宣言するだけです。

id<SomeProtocol> delegate; 

次に、MainViewController の viewDidLoad で次のように設定します。

homeVC.delegate = self;
//some where in MainViewController implement the protocol method
-(void)someAction
{
    //do something
}

次に、homeVC でボタンを押すと、次のように呼び出すだけです。

if ([self.delegate respondsToSelector:@selector(someAction)]) {
    [self.delegate someAction];
}

ブロックの使用:

HomeViewController.h で、ブロック プロパティを宣言します。

typedef void (^ActionBlock)();

@property (nonatomic, copy) ActionBlock block;

次に MainViewController ViewDidLoad で:

homeVC.block = ^(){
    //do something
};

次に、homeVC でボタンを押すと、次のように呼び出すだけです。

self.block();
于 2013-02-19T22:19:22.960 に答える