2012-06-16 3 views
1

iOS 버전과 관련하여 나타나는 하위 뷰 메소드와 관련된 이상한 문제가 나타납니다.보기를 전환 할 때 iOS 특정 동작

부모보기 컨트롤러가있는 스왑 가능보기는 표시 할보기보다 두 개 있습니다. 기본적으로 로그인 할 때 계정보기로 스왑 된 로그인보기가 있으며 로그 아웃 할 때 다시 로그인으로 바뀝니다.

코드는 아주 간단합니다. 다음은 로그인 할 때 호출되는 부모보기 컨트롤러의 샘플 메소드입니다.

- (void) showAccountView:(BOOL)animated 
{ 
    if(self.accountController == nil) 
     self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease]; 

    [self.loginController viewWillDisappear:animated]; 
    [self.accountController viewWillAppear:animated]; 

    [self.loginController.view removeFromSuperview]; 
    [self.view insertSubview:alertsController.view atIndex:0]; 

    [self.loginController viewDidDisappear:animated]; 
    [self.accountController viewDidAppear:animated]; 
} 

로그인보기를 표시하는 것과 같은 또 다른 방법이 있습니다. 꽤 직설적 인. 문제는 viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear 메서드가 모두 iOS 4.3에서 한 번 호출되었지만 iOS 5.0 및 5.1에서는 두 번 호출된다는 것입니다.

예를 들어, 모든 iOS 버전에서 하위보기의 viewWillAppear은 상위보기에서 직접 호출 할 때 호출됩니다 (당연히). 그러나 iOS 5.0 및 5.1에서만 insertSubview 호출 중에 두 번째 호출됩니다. 내가 removeFromSuperview 및 insertSubview에 대한 호출을 제외한 모든 것을 제거, 그렇다면

그래서, 그것은 다음과 같습니다

- (void) showAccountView:(BOOL)animated 
{ 
    if(self.accountController == nil) 
     self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease]; 

    [self.loginController.view removeFromSuperview]; 
    [self.view insertSubview:alertsController.view atIndex:0]; 
} 

지금 5.0 및 5.1에서 하위 뷰 방법은 insertSubview 동안 한 번씩 전화를받을. 그러나, 그들은 전혀 호출되지 않기 때문에 4.3 이하에서 문제가 발생합니다.

서브 뷰 메소드가 호출되는지 확인하는 것과 관련된 몇 가지 게시물을 읽었지만 iOS에 따라 동작이 달라 보이는 것과 같은 것을 보지 못했습니다.

또한이 작업을 수행하는 유일한 방법은 런타임시 iOS 버전을 확인하고 iOS 4.3 용 하위 뷰 메소드를 직접 호출하고 5.0 및 5.1에서 호출하지 않는 것입니다.

아이디어가 있으십니까?

+1

우선,'viewWill/Did'을 호출 할 필요가 없습니다 ... 둘째, 그들이 호출되지 않는다는 것을 어떻게 알 수 있습니까? – CodaFi

+0

나는 그들에게 전화해서는 안되는 데 동의하지만 분명히 내가 4.3에서 그들 자신에게 전화를받지 않기 때문에 나는한다. 내가 설정 한 브레이크 포인트가 맞지 않기 때문에 호출되지 않는다고 말할 수 있습니다. 또한 뷰의 기능에서 호출되지 않는다는 것이 명백합니다. 사실, 나는 방금 내가 대답 한 것과 비슷한 문제를 논의하는 [이 게시물] (http://stackoverflow.com/questions/7890374/viewwillappear-not-getting-called-with-uisplitviewcontroller)을 발견했다. 그들은 iOS에서 버그라고 가정하고 동적 버전 확인을 사용하는 것이 좋습니다. – d512

답변

0

당신은 iOS 5에 추가 된 새로운 부모/자식보기 컨트롤러 지원을 제외하고 다른보기 컨트롤러 안에 하나의보기 컨트롤러 내용을 가지고 있어야하지 않습니다. 이제는 공식적으로 새로운 메소드 (예 : addChildViewController,

iOS 4 이하 버전에서 하나의보기 컨트롤러보기를 다른 호스트에 호스트하려고하면 모든 단계에서 OS와의 전투가 진행됩니다.

+0

이 기술은 iOS 개발 도서에서 제외 시켰습니다. 그렇다면 5.0 이전 버전의 iOS 버전으로 얻고 자하는 것을 달성하기위한 적절한 방법은 무엇입니까? – d512

+0

@Duncan C 일부 ViewController에는 제한 사항이 있음을 알고 있습니다. UISplitViewController가 루트 여야합니다.그러나 UITableViewController를 UISplitViewController에 두는 것이 일반적입니다. 귀하의 요점을 분명히 해 주시거나, 그것을지지하는 문서를 알려주십시오. 감사. – Snips

+0

@strips, iOS 5 이전에는 사용자 정의보기 컨트롤러의 내용 중 하나를 다른 것으로 지정하지 않아야한다는 것을 의미했습니다. Apple의 컨테이너보기 컨트롤러 (탐색 컨트롤러, 탭 막대 컨트롤러 및 iPad, 분할보기 컨트롤러)는 특별하며 다른보기 컨트롤러를 포함하도록 설계되었습니다. iOS 5에 내장 된 상위/하위보기 컨트롤러 구성표를 사용하면 다른 동작을 가진 자체 컨테이너보기 컨트롤러를 만들 수 있습니다. 나는 파고를했는데 문서에서 anthers pre iOS 5 안에 하나의보기 컨트롤러보기가 없어야한다는 진술을 찾을 수는 없었지만 본 적이 있습니다. –

관련 문제