탐색 컨트롤러 내부의 탭 모음 컨트롤러 또는 탐색 루트보기 공유


80

저는 Tweetie 앱 에서와 같이 작동 하는 UI 구조를 구현하려고합니다 . 최상위 뷰 컨트롤러는 루트 뷰가 "계정"테이블 뷰인 탐색 컨트롤러 인 것 같습니다. 계정을 클릭하면 하단에 탭 바가있는 두 번째 레벨로 이동합니다. 각 탭 항목은 다른 목록을 표시하며 추가로 드릴 다운 할 수 있습니다 (이후 레벨에는 탭 표시 줄이 표시되지 않음).

따라서 이것은 구현 계층 구조가 다음과 같습니다.

  • UINavigationController
    1. 계정 :UITableViewController
    2. UITabBarController
      1. 트윗 :UITableViewController
        • 트윗 / 사용자 / 등의 상세보기
      2. 답글 :UITableViewController
      3. ...

이것은 작동하는 것처럼 보이지만 [^ 1]에 대한 SDK 문서에 따르면 지원되지 않는 것 같습니다 -pushViewController:animated:(강조 추가됨).

viewController : 스택에 푸시되는 뷰 컨트롤러입니다. 탭 막대 컨트롤러의 인스턴스가 될 수 없습니다.

비공개 API 등을 피하고 싶지만 제대로 작동하는 것처럼 보이지만이 사용이 명시 적으로 금지 된 이유가 무엇인지 잘 모르겠습니다. 이유를 아는 사람 있나요?

탭 모음 컨트롤러를 기본 컨트롤러로 설정하고 각 탭에는 별도의 탐색 컨트롤러가 포함되어 있습니다. 문제는 각 탐색 컨트롤러가 단일 루트 뷰 컨트롤러 (즉, Tweetie 의 "Accounts"테이블 ) 를 공유해야한다는 것입니다. 작동하지 않는 것 같습니다. 테이블 컨트롤러를 두 번째 탐색 컨트롤러로 푸시하면 제거되는 것 같습니다. 처음부터. 다른 계정을 선택할 때 모든 부기 관리는 말할 것도없고 아마도 고통 스러울 것입니다.

이를 올바른 방법으로 구현하려면 어떻게해야합니까?

[^ 1] : 탭 모음 컨트롤러는 해당 수준에있는 탭 모음 컨트롤러의 탐색 항목이 선택한 탭의 탐색 항목과 동기화 상태를 유지하도록 하위 클래스 화되어야하며 개별 탭의 테이블 컨트롤러는 self.tabBarController.navigationController대신 해당 세부보기를 푸시해야합니다. self.navigationController.

답변:


63

이전 두 가지 답변이 맞았습니다-저는 UITabBarControllerTweetie에서 사용하지 않습니다 . nav 컨트롤러 스택에 밀어 넣는 것이 만족 스럽지만 여전히 "view controller"철학에 따라 살아가는 사용자 지정 XXTabBarController(의 일반 하위 클래스 UIViewController) 을 작성하는 것은 매우 쉽습니다 . 계정 별 뷰 ( Tweets/ Replies/ Messages)의 각 "탭" 은 자체 뷰 컨트롤러이며, 그들이 염려하는 한 그들은 화면에서 plain-ol로 바뀝니다 UITabBarController.


2
사용자 지정 탭 모음 컨트롤러 클래스는 자식 컨트롤러의 navigationItem 및 navigationController 속성에 대한 연결을 어떻게 처리합니까?
bvanderveen 2011 년

iOS 5에서 변경 되었습니까? 루트 컨트롤러로도 너무 많은 문제없이 UITabBarController를 UINavigationController에 추가 할 수있는 것 같습니다.
sparkFinder 2012 년

33

저는 Tweetie와 유사한 탐색 프레임 워크를 사용하는 앱을 만들고 있습니다. 이 작업을 수행하는 방법에 대한 게시물을 내 블로그 www.wiredbob.com 에 작성했으며 소스 코드에도 연결되어 있습니다. 다른 프로젝트의 기초로 사용할 수있는 전체 템플릿입니다. 행운을 빕니다!


10
궁금한 사람들을 위해 언급 된 블로그 게시물의 링크는 wiredbob.com/blog/2009/4/20/…입니다.
Anh

@Robert Conn, 정말 멋진 튜토리얼. 나는 당신의 개념을 사용하고 있지만 어떤 이유로 내 tabBar가 활성화되지 않았습니다. 앱을 구현할 때 이런 일이 발생 했나요?
A Salcedo

@ASalcedo : 나도이 문제가 있었지만 www.wiredbob.com의 소스 코드에서 탭 표시 줄 항목과 관련된 뷰의 크기를 줄여야했기 때문에 기본 높이 크기 인 460이 커졌다는 것을 알게되었습니다. 탭 바를 허용하기 위해 탭 항목에 대해 설정된 높이가 369임을 알 수 있습니다. 인터페이스 빌더에서 높이를 변경하려면 뷰의 속성 관리자에서 상태, 상단 및 하단 막대가 모두 없음으로 설정되어 있는지 확인해야합니다 (즉시 명확하지 않음).
Izac 2011

2
블로그 게시물은 나를 위해 죽었습니다. 누군가가 거짓말을 할 가능성이 있습니까?
Tiago Veloso 2015


10

모든 UIViewController에 UITabBar를 추가 할 수 있습니다. 이렇게하면 실제로 UITabBarController를 푸시 할 필요가 없으므로 Apple API의 지침을 준수합니다.

인터페이스 빌더에서 UITabBar는 Cocoa Touch Library의 "Windows, View & Bars"에 있습니다.


1
안녕! @Himadri Choudhury는 "그러므로 Apple API의 지침을 따르십시오"라고 설명해 주실 수 있습니까? 아니면 참조를 주실 수 있습니까? 이 가이드 라인이 어디에서 전달되었는지 찾을 수 없습니다 (존재하는지 의심하지 않지만 URL을 찾을 수 없습니다). 대단히 감사합니다
darksider

10

내 앱 몇 개에서이 작업을 수행합니다. navigationController 기반 앱에 탭 바를 추가하는 비결은 TabBarController를 사용하지 않는 것입니다. 보기에 탭 표시 줄을 추가하고, 해당보기에 대한보기 컨트롤러를 TabBarDelegate로 만들고,보기 컨트롤러 코드의 탭 표시 줄에서 사용자 선택에 응답합니다.

Tab Bars를 사용하여 Tab Bar의 뷰에 하위 뷰로 추가 뷰를 추가하고, 다른 데이터 세트로 테이블 뷰를 다시로드하고, UIPickerView를 다시로드하는 등의 작업을 수행합니다.


6

UITabBar내 뷰를 표시하려고 할 때 숨겨 질 것이기 때문에 지난 한 시간 동안 a를 구현하는 데 어려움을 겪고있었습니다 . 그런 다음이 게시물을 찾았 습니다 .

기본적으로 다음 코드 줄에 따라 탭바 아래에 새보기를 삽입해야합니다.

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];

이것이 사라지는 탭 표시 줄을 수정하는 데 도움이되었습니다. Robert Conn이 제안한 것과 동일한 코드를 사용했지만 두 번째보기로 전환하면 어떻게 든 ui 탭 표시 줄이 사라집니다.
Vijay Katam 2012 년

3

내 앱에서 루트 뷰 컨트롤러는 UINavigation 컨트롤러입니다. 앱의 특정 지점에서 UITabBar를 표시해야합니다. 이전 게시물 중 일부가 제안했듯이 탐색 계층 구조 내의 UIView에 UITabBar를 구현하려고 시도했지만 작동합니다. 그러나 탭 컨트롤러가 제공하는 기본 동작을 더 많이 원한다는 것을 알았고 UINavigation 컨트롤러와 함께 UITabBarController를 사용하는 방법을 찾았습니다.

1) UITabBarController의 뷰를 표시하려면 다음을 수행합니다.

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;

2) 탐색 계층 구조에서 내가 있던 위치로 돌아가고 싶을 때 다음을 수행합니다.

appDelegate.window.rootViewController = myNavControllerInstance;

3

이것은 단순히 네비게이션 컨트롤러에 TabBarController를 포함시킴으로써 달성 될 수 있습니다. 스토리 보드에서 :

  1. ViewController 드래그
  2. ViewController의 장면을 클릭하십시오
  3. 에디터 >> Embed in >> Navigation Controller를 클릭하십시오.
  4. 동일한 ViewController에서 버튼을 드래그합니다.
  5. TabBarController 드래그
  6. Segue Action 푸시를 통해 ViewController의 버튼을 TabBarController에 연결합니다.

이 경우 TabBarController의 RootViewController 만 탐색 컨트롤러의 스택에 있습니다. 모든 TabBarItems는 상단에 탐색 모음이 있으며 사용자는 선택한 TabBarItem에 관계없이 언제든지 홈 화면으로 이동할 수 있습니다.

이것은 Navigation Controller의 스택에있는 모든 ViewController에서 수행 될 수 있습니다.

작동하면 다음 답변에서 이미지와 코드를 게시 할 수 있도록 평판을 높이는 방법을 제안하십시오. :)


3

이것이 내가 한 방법입니다. 이것은 실제로 tabbarcontroller를 탐색 컨트롤러로 밀어 넣는 것입니다. 잘 작동합니다. 나는 문서에서 애플이 이런 식으로 지원하지 않는다는 것을 찾지 못했습니다. 누군가 나에게이 경고에 대한 링크를 줄 수 있습니까?

이것이 사실이라면 애플이 내 앱을 앱 스토어에 게시하는 것을 거부 할 수 있습니까?

-(void)setArrayAndPushNextController
{
    MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init];
    MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init];

    myFirstViewController.array = self.array;


    NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil];
    UITabBarController *tab = [[UITabBarController alloc] init];
    tab.viewControllers = array;

    [array release];

    UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1];
    UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2];

    myFirstViewController.tabBarItem = item1;
    mySecondViewController.tabBarItem = item2;

    [self stopAnimatingSpinner];

    [self.navigationController pushViewController:tab animated:YES];

    [tab release];
    [item1 release];
    [item2 release];
}

당신은 당신의 UIViewControllers 해제 fogot
Gargo을

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.