0

모달 뷰 및 컨테이너 뷰와 결합 할 때 느린 시제가 예상대로 작동하지 않는 것 같습니다. (가) "저를 누르십시오"버튼을 탐색 컨트롤러에 내장되고으로있는 tableView이있는 모달보기를 밀어 두드리고자식 뷰 컨트롤러에서 예상치 못한 동작 해제

Unwind segue bug hierarchy image

: 여기 found on github을 할 수있는 테스트 프로젝트에 대한 뷰 컨트롤러 계층의 하위보기 컨트롤러. tableView의 행을 탭하면 다른 tableView가 푸시됩니다. 마지막으로,이 최종 테이블 뷰 의 행을 탭하면은 이전보기 컨트롤러에서 찾은 bUnwindSegue이라는 unwind segue를 호출해야합니다.

문제 :

  1. bUnwindSegue가 호출되지 않습니다.
  2. 기술 노트 TN2298에 따르면 컨테이너보기 컨트롤러는 하위보기 컨트롤러를 선택하여 segue를 처리합니다. 이 경우 컨테이너보기 컨트롤러에서 viewControllerForUnwindSegueAction:fromViewController:withSender:을 호출해야합니다. 그렇지 않습니다. 예제 프로젝트에서

, 당신은 BTableViewController이 언 와인드 SEGUE 포함되어 있음을 볼 수있다 : 스토리 보드에서

- (IBAction)bUnwindSegue:(UIStoryboardSegue *)segue; 
{ 
    NSLog(@"Unwinding...this unwind segue will never get called."); 
} 

CTableViewController의 셀 선택 동작은 실제로 bUnwindSegue입니다. 또한 셀 선택 동작을 CTableViewController으로 변경하면 컨테이너보기 컨트롤러 (containerVCUnwindSegue)의 unwind segue로 변경되어 segue가 올바르게 호출됩니다.

unwind segues가 예상대로 작동하지 않습니까?

+0

unwind segue 메소드는 * to *로 되 돌리는 뷰 컨트롤러에 있어야합니다. –

+0

@LyndseyScott BTableViewController는 unwnd되고있는 VC입니다. – memmons

+0

@LyndseyScott 현재 unwind segue는 스토리 보드를 통해 설정됩니다. 변경 사항도 거기에서 발생해야합니다. 또는 스토리 보드를 풀고 프로그래밍 방식으로 설정할 수 있습니다. 두 경우 모두 똑같이 행동 할 것으로 기대합니다. – memmons

답변

0

(1) 귀하가 인용 한 기술 노트 TN2298을 오해하고 (2) viewControllerForUnwindSegueAction:을 적절하게 무시하지 않아야합니다. 당신은 컨테이너 뷰 컨트롤러에 대해에 링크 된 TN2298의 문서 섹션으로

는 "은 긴장을 풀고 작업을 처리 할 수있는 자식보기 컨트롤러 선택"부제목 아래에 상태 :

메소드를 오버라이드 (override) 할 필요가 귀하의 컨테이너 뷰 컨트롤러가 에 표시된

[viewControllerForUnwindSegueAction :] 자식을 검색하려면 unwind를 처리하려는보기 컨트롤러에 대한 컨트롤러보기 작업. 컨테이너의 자식 뷰 컨트롤러 중 어느 것도 unwind 동작을 처리하지 않으려는 경우 super 구현을 호출하고 결과를 반환해야합니다.

먼저 오프, 방법을 대체 할, 당신은 당신의 스토리 보드에서 UINavigationController를 서브 클래스 화해, 거기에 viewControllerForUnwindSegueAction: 방법을 추가해야합니다. 그렇게하면 메서드가 현재 예상대로 호출되는 것을 볼 수 있습니다.

두 번째 오류는 현재 viewControllerForUnwindSegueAction: 메서드를 재정의하려는 시도가 단순히 return self;을 포함한다는 것입니다. unwind 동작을 처리 할 뷰 컨트롤러를 반환해야합니다.

그래서 말을, 예를 들어, 당신은 BTableViewController의 현재 인스턴스를 보유 할 VCWithContainedVCsViewController에서 공용 변수가 그리고 당신은 당신이 현재 컨테이너 뷰 컨트롤러, 전 액세스 할 수있어 액세스 :

- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender 
{ 
    NSLog(@"Technical note TN2298 indicates child VCs defer to their parent to determine where an unwind segue will be handled."); 

    if ([NSStringFromSelector(action) isEqualToString:@"bUnwindSegue:"]) { 

     NSLog(@"%@", self.viewControllers); 
     VCWithContainedVCsViewController *containerVC = (VCWithContainedVCsViewController*)self.viewControllers[0]; 
     return containerVC.container; 
    } 

    return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender]; 
} 

을 당신 이 경우 실제로는 bUnwindSegue:이 호출되고 (메시지가 인쇄되어야 함) 볼 수는 있지만, 여전히 segue는 발생하지 않습니다.

왜 이런가요?

의견에서 언급 한 바와 같이 BTableViewController은 현재 탐색 스택에서 이 아니기 때문에입니다. CTableViewController과 같은 BTableViewController의 일부 하위보기 컨트롤러는 예를 들어 CTableViewController이 컨테이너보기가 아니기 때문에 탐색 스택에 표시됩니다. 그러나 BTableViewController 자체는 현재 탐색 스택에 없으므로 자체적으로 segue를 수행 할 수 없습니다. 따라서 문서 상태와 같이 unwind 액션을 처리 할 자식 뷰 컨트롤러를 실제로 선택할 수는 있지만 BTableViewController은 그 중 하나가 될 수 없습니다.

+0

'VCWithContainedVCsViewController'의'viewControllerForUnwindSegueAction'이 절대로 호출되지 않습니다. 나는 자기를 스텁 (stub)으로 돌려 놓고 테스트 목적으로 브레이크 포인트를 배치 할 것입니다. – memmons

+0

@ MichaelG.Emmons 나는 오해하지 않는다. 내가 말했듯이 View Controller의 클래스에는 없지만 Navigation View Controller의 하위 클래스에 있어야하기 때문에 호출되지 않습니다. "먼저, 메서드를 재정의하려면 스토리 보드에서 UINavigationController의 하위 클래스를 만들고 viewControllerForUnwindSegueAction을 추가해야합니다 : 메소드를 호출하면 메소드가 예상대로 호출되고 있음을 알 수 있습니다. " –

+0

아. 나는이 SO 응답이 nav 컨트롤러 (https://stackoverflow.com/questions/16092189/unwind-segue-for-uinavigationcontroller)를 서브 클래 싱하는 것을 권장 함을 본다. 충분하다. 그러나 이는 기술 노트가 가리키는 것과 직접적으로 관련이있다. 'UINavigationController와 같이 SDK에서 제공하는 컨테이너보기 컨트롤러를 사용하는 경우 자동으로 처리됩니다.' – memmons

관련 문제