8

내가 커스텀 컨테이너 뷰 컨트롤러 (MainViewController)가 말 행동의 부모에게 통보 누르면 다음보기 컨트롤러로 넘어 가야합니다. 따라서 MainViewController에이 작업을 알릴 필요가 있습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?컨테이너보기 컨트롤러 내가 같은 것을 할 경우

보기 컨트롤러간에 사용자 지정 전환을해야하기 때문에 사용자 지정 컨테이너를 사용하고 있습니다. "이동"을 누르면 새 View Controller의 뷰가 움직이는 동안 HomeViewController의 일부 뷰가 애니메이션으로 나타납니다.

분명히 HomeViewController에 MainViewController 유형의 속성을 부여하고 그런 식으로 전화를 걸 수 있지만 컨테이너보기 컨트롤러 API가있는 깨끗한 방법이 필요합니다.

답변

15

위임자 또는 차단을 사용할 수 있습니다.

id<SomeProtocol> delegate; 

을 다음 MainViewController의있는 viewDidLoad에서 다음과 같이 설정하십시오 :

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

그냥 같이 HomeViewController.h에 대리자를 선언 프로토콜을 만들기 위임

를 사용

:

당신이 homeVC에있는 버튼을 누르면

다음, 단지 전화 : 블록를 사용

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

: 다음

typedef void (^ActionBlock)(); 

@property (nonatomic, copy) ActionBlock block; 

:

HomeViewController.h에서 블록 속성을 선언 MainViewController ViewDidLoad :

당신이 homeVC에있는 버튼을 누르면3210

다음, 단지 전화 :

self.block(); 
+0

좋아, 그래서 나는있는 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

좋은 빠르고 더러운 여기의 길. 프로토콜을 작성하는 데 조금 더 시간이 있다면 선택한 대답을 사용하십시오. 감사합니다 pedro! –

3

할 수있는 이것은 매우 일반적인 패턴이다.부모는 조치를 처리 할 실제 인스턴스이며 및 default extension을 제공합니다.

부모 뷰 컨트롤러 :

protocol SomeProtocol { 
    func foo() 
} 

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

아이 뷰 컨트롤러 : 스위프트 3에서

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

고마워이게 내가 뭘 찾고 있던지였다 :) – mic

관련 문제