0

내 앱에 탭 막대 컨트롤러가 있고 탭 항목 중 하나가 분할보기 컨트롤러입니다. 마스터보기 컨트롤러 (즉, 인덱스 0)는 펜촉에서로드 된 네비게이션 컨트롤러입니다.메모리 부족 경고로 내보기가 사라지는 이유는 무엇입니까?

조금 흐릿한 것으로 들리지만 1) IB의 TBC에 SVC를 추가 할 수없고 2) iOS 4.2 splitview-navbar-colorTint 버그가있는 조합으로 분류됩니다. 그리고 어제는 어제 해결 방법을 구현 한 이후로 메모리 부족 경고로 인해 문제가 발생했습니다.

해결 방법 전에 2 개의 nav 컨트롤러를 사용하여 SVC를 설치하고 TBC에 프로그래밍 방식으로 (IB 탭 제한으로 인해 IB의 제한 사항으로 인해) SVC를 추가했지만 문제가 없으면 - 그 사과 버그를 제외하고는.

작은 workaround demo도 메모리 부족 경고 이후에도 정상적으로 작동합니다. 그러나 탭 표시 줄의 추가 오버 헤드는 포함되지 않습니다.

그러나 my adaption of the workaround demo에서는 모두 배 모양이 시작됩니다. 분할보기를 표시하는 동안 메모리 부족 경고를 보내면 왼쪽 전체 (마스터보기)가 사라집니다. 실제로 장치에서 동일한 동작을 처음 발견했습니다.

나는 무슨 일이 일어 났는지 의문입니다. 디스플레이상의 뷰 (nav cont의 루트 뷰)는 테이블 뷰 서브 클래스에 의해 제어됩니다. didReceiveMemoryWarning을 재정의했지만 도움이되지 않습니다. 게다가 (이에 상응하여!) superview는 0이 아닙니다. 그것은 UITableView입니다. 완벽하게 수정하십시오.

그래서 Nav 컨트롤러가 출시 될 예정입니다. 그러나 어디에서? 왜 원래 데모에 없었습니까? 차이점은 이제 내 탭 막대 컨트롤러 추가입니다. 탭 바에 추가하는 코드는 다음과 같습니다.

- (void) addTabItemSplitViewWithNavConRoot:(BOOL)hasRootNC { 

    // init master/detail views 
    SV1RootViewController *rvc = [[SV1RootViewController alloc] initWithNibName:@"SVC1RootView" bundle:nil]; 
    SV1DetailViewController *dvc = [[SV1DetailViewController alloc] initWithNibName:@"SVC1DetailView" bundle:nil]; 

    rvc.detailViewController = dvc; 

    UINavigationController *nc = nil; 
    if (hasRootNC) { 
     nc = [self.pSVC1.viewControllers objectAtIndex:0]; 
     nc.viewControllers = [NSArray arrayWithObjects:rvc, nil]; 
     nc.navigationBar.tintColor = [UIColor redColor]; 
    } else { 
     nc = nil; 
    } 

    UIViewController *vc = (hasRootNC)? (UIViewController*)nc :rvc; 

    UISplitViewController *svc = [self newSplitViewControllerWithMasterVC:vc detailVC:dvc]; 
    svc.delegate = dvc; 

    // init the tab bar item 
    svc.tabBarItem = [[UITabBarItem alloc] initWithTitle:(hasRootNC)? @"SplitView with Nav Root":@"Simple SplitView" 
                image:nil 
                tag:0];  
    // int the split view 
    NSMutableArray *controllersArray = [NSMutableArray arrayWithArray:self.pTabBarController.viewControllers]; 
    [controllersArray addObject:svc]; 
    [self.pTabBarController setViewControllers:controllersArray]; 

    // cleanup 
    [nc release]; 
    [rvc release]; 
    [dvc release]; 
    [svc release]; 
} 

- (UISplitViewController*) newSplitViewControllerWithMasterVC:(UIViewController*)masterView 
                detailVC:(UIViewController*)detailView { 

    UISplitViewController *svc = [[UISplitViewController alloc] init]; 
    NSMutableArray *controllersArray = [NSMutableArray arrayWithObjects:masterView, detailView, nil]; 
    [svc setViewControllers:controllersArray]; 

    return svc; 
} 

아무도 저에게 아이디어를 제공해 주시겠습니까? :)

그것은 정신 나간다!

+0

코드를 다시 포맷하십시오. – Joe

답변

1

해결되었습니다. 스플릿 뷰 컨트롤러를 프로그래밍 방식으로 초기화하는 대신, 메인 윈도우 xib (모든 것은 Apple 버그에 필요한 커스텀 툴바이기 때문에)에서 읽는 nav 컨트롤러로 주입하는 것이 좋을 것입니다. 하지만 제 추측으로는 xib의 nav 컨트롤러가 뷰를 언로드한다는 것입니다.

이제는 손으로 구성하지 않고 펜촉에서 전체 SVC를 가져옵니다. 훨씬 더 간단하고 실제로는 훨씬 간단합니다.

오. 나는 an answer to this question ('지정된'대답!)에 의해 길을 잃었다. 나는 이제 훨씬 더 간단한 방법이 또한 대답으로 주어졌으며 실제로 가장 인기가 있음을 발견했습니다. 그것을 간과했다!^

+0

감사합니다! 나는 똑같은 문제로 미쳐 가고 있었다. IB로 일을 정리하자마자 일을 시작했습니다. –

0

코드를 모두 보지 않고도 mem 경고 중에 비활성보기가 삭제 된 것 같습니다. ('didReceiveMemoryWarning'이라고 쓰여있는 코드 비트)

loadView 메소드에서 추가해야하는 모든 하위 뷰가 뷰에 다시 추가되었는지 확인해야합니다. 그에 따라 배치. 희망이 도움이됩니다.

또는 서두르거나 게으른 사람이라면 일상적인 일이 일어나지 않도록하십시오. 이것은 가능할 수 없으며 충돌을 일으킬 수 있지만 참을성이 없다면 다른 방법이 될 수 있습니다.

- (void)didReceiveMemoryWarning { 
    //do nothing 
    //[super didReceiveMemoryWarning]; 
} 
+0

필자가 작성한 "didReceiveMemoryWarning을 오버라이드했지만 도움이되지 않습니다. 더하기 (대응하여!), superview는 0이 아닙니다. 그것은 UITableView입니다. 올바르게." 나는 명시 적으로 말하지 않았지만, 그렇습니다. msg를 super로 제거했습니다. – Rich

+0

loadView는 어떤 모습입니까? 그리고 당신은 데이터 소스/위임에서 UITableView를 다시로드 할 수 있습니까? [self.tableView reloadData]와 같은 뭔가요? –

+0

흠 ..보기는 (SV1RootViewController *) rvc에 속한 닙 SVC1RootView에서로드됩니다. 차례대로, rvc는 (UINavigationController *) nc.viewControllerers에 쓰여졌습니다. splitview 컨트롤러를 초기화하는데 사용되었으며, tabBarItem에 할당되어 MainWindow.xib의 탭 막대 컨트롤러에 추가되었습니다.이 탭 컨트롤러의보기는 호출 후 바로 윈도우에 추가됩니다 위의 방법. 따라서 loadView를 직접 연결하지 않습니다. 아니면 내가?!? – Rich