2014-06-09 2 views
1

2 개의 뷰 ParentViewControllerChildViewController이 있습니다. 을 ParentViewController 안에 중첩시키고 자합니다. 나는 스토리 보드에 ParentViewControllerChildViewController을 디자인했습니다. ParentViewController.m에는 부모에 대한 논리가 포함되고 ChildViewController.m에는 하위에 대한 논리가 포함됩니다. ParentViewController.m에서 나는과 같이 아이를 추가ChildViewController에서 ParentViewController로 데이터 전달

ChildViewController *childVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildSBI"]; 
[self addChildViewController:childVC]; 

내 질문 : 어떻게 다시 부모의 자녀에서 (있는 NSString 같은) 정보를 수신 할 수 있습니까? delegation을 통해이 작업을 수행해야합니까?

답변

1

일반적인 패턴은 parent의 속성으로 child을 가지며 parentchild의 대리인이됩니다. 가장 먼저해야 할 일은 자신의 프로토콜을 만드는 것입니다.

// MyProtocol.h 
- (void)heyParentSomethingHappened:(Something)something; 

다음, 그래서 그들은 위임을 통해 이야기 할 수있는 parent의 속성 child을합니다.

// ParentVC.m 
@interface ParentVC() 
@property (nonatomic) ChildVC *child 
@end 

이제 parent이 속성으로 child을 가지고, 그들은 이야기 할 수있는 방법이 필요합니다. 이것은 대표단이 들어오는 곳입니다. 학부모는 MyProtocol을 준수하십시오.
// ParentVC.h 
@interface ParentVC : UIViewController <MyProtocol> 

이제 parent이 특별한 프로토콜을 준수 함은 child가 위임 할 수 있습니다.

//ChildVC.h 
@interface ChildVC : UIViewController 
@property (nonatomic) id <MyProtocol> delegate. 
@end 

이제 childdelegate 속성을 가지고, 부모로 설정하고 당신은 갈 수 있습니다. 당신의 child 필요가 경고 할 때

// ParentVC.m 
- (id)init { 
    // do your init 
    self.child.delegate = self // both (child.delegate, self) conform to <MyProtocol>, so no type mismatch. 
} 

지금 뭔가의 parent, 그들은 프로토콜 + 대표단을 통해 이야기의 공식적인 방법이 당신.

// ChildVC.m 
- (void)someFunc { 
    [self.delegate heyParentSomethingHappend:[Something new]]; 
} 

프로토콜 파일을 사용할 때는 항상 포함 시키십시오.

+0

감사합니다. 어떻게하면 블록으로이 작업을 수행 할 수 있습니까? – Apollo

+0

프로토콜을 변경하여 블록을 전달할 수있는 메소드를 포함하십시오. @아폴로 –