developer tip

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

copycodes 2020. 10. 10. 10:11
반응형

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


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

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

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

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

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

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

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

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

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


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


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


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

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


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

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


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

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

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

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

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

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

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

appDelegate.window.rootViewController = myNavControllerInstance;

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

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

-(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];
}

이것은 단순히 네비게이션 컨트롤러에 TabBarController를 포함시킴으로써 가능합니다. 스토리 보드에서 :

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

In this case only the TabBarController's RootViewController would be in the Navigation Controller's stack. All The TabBarItems would have the Navigation Bar at the top and user can go to Home Screen at any time, irrespective of the selected TabBarItem

This could be done at any ViewController in the Navigation Controller's stack.

If it works, please suggest me how to increase the reputation so that I can post the images and the code in the next answer. :)


I wrote a blog post on how I approached this problem. For me, using a modal view was a simpler solution than writing a custom tab-bar implementation.

http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/

참고URL : https://stackoverflow.com/questions/576764/tab-bar-controller-inside-a-navigation-controller-or-sharing-a-navigation-root

반응형