8

の親に通知し、私は私がこのような何かをカスタムコンテナビューコントローラ(MainViewControllerを)持っていると言う:コンテナビューコントローラ - アクション

- (void)viewDidLoad 
{ 
    [super viewDidLoad];   

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

} 

HomeViewControllerがボタンを持っているだろう、その結果、「行く」と次のView Controllerに進む必要があります。だから私はこのアクションのMainViewControllerに通知する必要があります。これを行う最善の方法は何ですか?

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

明らかに、私はHomeViewControllerにMainViewController型のプロパティを与えて、そのように呼び出すことができますが、コンテナビューコントローラAPIを使ってきれいな方法があることを望んでいます。

答えて

15

delegateまたはblockを使用できます。デリゲート

を使用して

はプロトコルを作成します。

@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(); 
+0

[OK]を、ので、私はのUIViewControllerコンテAPIから利用できることは何もありませんか? – soleil

+0

この投稿は役に立たないかもしれません[これをチェックしてください](http://stackoverflow.com/questions/8379759/how-does-view-controller-containment-work-in-ios-5) –

+1

私は+1したい私ができるなら、これは3倍以上です。私には同じ質問に答えるだけでなく、ブロックの理解が10倍になりました:) – Pedro

10

すぎ... すべてのビューコントローラは、あなたがこれを行うことができます使用してparentViewController性質を持っている別の方法があります...

MainViewController

HomeViewControllerに続いて

- (void)someMethod:(BOOL)someParam; 

...あなたを実行する操作のためのメソッドを定義します...

MainViewController* parent = (MainViewController*)[self parentViewController]; 
[parent someMethod:paramValue]; 

HTHを行うことができます:)

+2

ここで素早く汚い道です。プロトコールを作成する時間がもう少しあれば、選択した答えを使用してください。感謝ペドロ! –

3

これは非常に一般的なパターンです。親は、アクションを処理する実際のインスタンスで、とdefault extensionを指定します。スウィフト3では

親ビューコントローラ:

protocol SomeProtocol { 
    func foo() 
} 

extension ParentViewController: SomeProtocol { 
    func foo() { 
     // Parent handles it 
    } 
} 

子ビューコントローラ:

@IBAction func tapGo(_ sender: Any) { 
    (parent as? SomeProtocol)?.foo() 
} 
+0

ありがとう、これは私が探していたものでした:) – mic

関連する問題