2013-01-07 1 views
3

많은 옵션을 시도했지만 그 중 아무 것도 작동하지 않았습니다. 문제는 간단합니다 :동일한보기 컨트롤러의 인스턴스가 두 개 있습니다. 하나는 TabBarController에서 작동하지 않습니다.

5 개의 탭에 대해 완벽하게 작동하는 하나의 UITabBarController가 있습니다.

내 문제는 첫 번째와 두 번째 탭에 있습니다. 각 탭에서 동일한보기 컨트롤러를 사용해야하지만 물론 두 개의 다른 인스턴스가 필요합니다.

두 개의 다른 네비게이션 컨트롤러를 추가하려고했는데 모두 루트 컨트롤러와 동일한보기 컨트롤러를 가리키고 있습니다. 이 방법으로 각 탐색 컨트롤러에서 탭 텍스트와 아이콘 (이 인터페이스 빌더에서 주로 작업)을 사용자 정의 할 수 있습니다. 첫 번째 탭 작업 (NavController1에 의해 처리 한), 두 번째 (I 절대적으로 표시되는보기 모르겠지만,은, 블랙 비어와 가진보기를 표시하지 않습니다이 구성

   __ NavController 1 _ 
      /     \ 
TabController -- NavController 2 -- ViewController 

기본 빈 파란색 탐색 표시 줄). 내비게이션 컨트롤러에서 내보기 컨트롤러로의 링크를 하나만 유지하면 다음과 같습니다.

   __ NavController 1 
      /     
TabController -- NavController 2 -- ViewController 

두 번째 탭은 완벽하게 작동합니다.

다른 옵션은 NavController를 두 번 연결하는 것입니다. 그러나이 경우 탭 인덱스에 따라 프로그래밍 방식으로 제목과 이미지를 구성해야하며이 작업을 수행 할 위치가 어디인지 확실하지 않습니다.

그래서 :

  • 이 정상적인 행동인가?
  • IB 솔루션이 있습니까?
  • 프로그래밍 방식으로 탭 모양을 설정해야하는 경우 어떻게해야합니까?

답변

1

프로그래밍 방식으로 처리하려는 경우 위와 비슷한 코드를 앱 대리인에서 사용할 수 있습니다.

UITabBarController *tbc = [[UITabBarController alloc] init]; 


MyViewController *mvc1 = [[MyViewController alloc] init]; 
MyViewController *mvc2 = [[MyViewController alloc] init]; 
[email protected]"One"; 
[email protected]"Two"; 
mvc1.tabBarItem.image=[UIImage imageNamed:@"one.png"]; 
mvc2.tabBarItem.image=[UIImage imageNamed:@"two.png"]; 


UINavigationController *nc1 = [[UINavigationController alloc] initWithRootViewController:mvc1]; 
UINavigationController *nc2 = [[UINavigationController alloc] initWithRootViewController:mvc2]; 


[tbc setViewControllers:[NSArray arrayWithObjects:nc1,nc2, nil]]; 


self.window.rootViewController = tbc; 
+0

감사합니다. 알겠습니다. 즉, 프로그래밍 방식으로 모든 Tabbar를 설정해야합니다. 나는 그것을 할 수있다. 나는 애플이 스토리 보드 에디터에서이 기능을 추가하기 전에 그것을하는 것이 "옛날 방식"이라고 생각한다. 대답을 확인하기 전에 인터페이스 빌더로 솔루션을 얻었는지 확인하기 만하면됩니다. 어쨌든 빠른 답장을 보내 주셔서 감사합니다! –

+0

이 봐,이 이상한입니다 : 당신이 제안대로 프로그래밍 방식으로 탭 표시 줄을 설정할 때 내 TableViewController 내 프로토 타입 셀 ([tableView dequeueReusableCellWithIdentifier : cellId] 호출하여) 더 이상 검색하지 않습니다, 항상 nil 반환합니다. 스토리 보드가 인스턴스를 생성 할 때와 대조적으로 [[... alloc] init]을 통해 컨트롤러를 할당 할 때 다른 뭔가가 있다고 가정합니다. 내가 찾을 수없는 순간, 구체적인 init 메소드가 없습니다. 조사를 계속하고 있지만 팁이 있다면 –

+0

OK 찾았습니다. 해결책은 메인 스토리 보드에서 객체를 인스턴스화하는 것입니다. UIStoryboard * st = [UIStoryboard storyboardWithName : [[NSBundle mainBundle] .infoDictionary objectForKey : @ "UIMainStoryboardFile"] 번들 : [NSBundle mainBundle]]; MasterViewController * placesView = [st instantiateViewControllerWithIdentifier : @ "masterListView"]; –

0

IB에서이 작업을 수행 할 수 있어야합니다. 두 개의 탭의 기본 컨트롤러로 두 개의 탐색 컨트롤러를 추가하고 질문에 표시된 것과 같이 각각에 루트보기 컨트롤러를 추가하고 해당 루트보기 컨트롤러의 클래스를 하위 클래스로 변경하십시오.

편집 후

당신이 루트 뷰 컨트롤러의 하나로서 만들어진 복잡한 장면이있는 경우, 복사 및 붙여 넣기, 다른 하나는 왼쪽에있는 개체 목록에 표시됩니다 수 있습니다 IB 창 (그리고 캔버스에서도 마찬가지지만, 다른 창 바로 위에 있으므로,보기 위해 그것을 끌 필요가 있습니다). 두 번째 탐색 컨트롤러를 연결할 수 있습니다. 그런 식으로 할 수도 있고 두 개의 다른 UIViewController에서 드래그하여 하위 클래스로 변경할 수도 있습니다 (두 개의 다른 인스턴스에 서로 다른 인터페이스가 필요한 경우).

+0

Mmmm, 내가 한 것처럼 보입니다. 각각에 루트보기 컨트롤러를 추가했지만 루트는 두 탐색 컨트롤러에 대해 동일한보기 컨트롤러입니다. 그리고 그것은 같은 view controller이기 때문에 작동하지 않습니다. 같은 뷰 컨트롤러를 2 개의 다른 네비게이션 컨트롤러의 루트로 선언하는 것은 불가능합니다. 최소한이 시나리오에서는 tabbarcontroller를 사용하십시오. –

+0

@ChristopheFondacci, 당신이 같은 뜻인지 모르겠다 - 당신은 동일한보기 컨트롤러 장면에 2 개의 탐색 컨트롤러 사이의 연결을 만들었습니까? 그렇다면, 내가 한 말은 아니에요. 2 개의 네비게이션 컨트롤러를 추가하고, 기본적으로 루트보기 컨트롤러로 얻는 tableViewController를 삭제하고, 두 개의 새로운보기 컨트롤러를 끌어 왔으며, 각 네비게이션 컨트롤러에 하나씩 연결하고,이 두 컨트롤러의 클래스를 내 서브 클래스로 변경했습니다. 그것은 잘 작동 - 만약 내가 각 하나의 버튼을 넣고, 로그 자체가, 나는 그들이 동일한 클래스의 두 가지 인스턴스가 나타납니다. – rdelmar

+0

@ChristopheFondacci, 편집을 참조하십시오. IB에서이 작업을 수행 한 두 가지 방법이 있습니다. – rdelmar

관련 문제