내비게이션 컨트롤러 내부의 탭 바 컨트롤러 또는 내비게이션 루트보기 공유
-
05-09-2019 - |
문제
나는 트윗 앱은 그렇게 행동합니다. 최상위 뷰 컨트롤러는 내비게이션 컨트롤러 인 것으로 보이며 루트보기는 "계정"테이블보기입니다. 계정을 클릭하면 바닥에 탭 막대가있는 두 번째 레벨로 이동합니다. 각 탭 항목에는 다른 목록이 표시되며 추가로 드릴 다운 할 수 있습니다 (후속 레벨에는 탭 막대가 표시되지 않음).
따라서 이것은 구현 계층 구조가 다음과 같습니다.
UINavigationController
- 계정:
UITableViewController
UITabBarController
- 트윗:
UITableViewController
- 트윗/사용자 등의 세부 사항보기
- 답장:
UITableViewController
- ...
- 트윗:
- 계정:
이것은 작동하는 것처럼 보이지만 [^1] SDK 문서에 따라 지원되지 않은 것 같습니다. -pushViewController:animated:
(강조 추가) :
ViewController: 스택에 밀려 나가는 뷰 컨트롤러. 탭 바 컨트롤러 인스턴스가 될 수 없습니다.
개인 API 등을 피하고 싶지만이 사용법이 왜 잘 작동하는지에도 명시 적으로 금지되는 이유는 확실하지 않습니다. 그 이유를 아는 사람이 있습니까?
탭 바 컨트롤러를 메인 컨트롤러로 넣는 것에 대해 생각했으며 각 탭에는 별도의 탐색 컨트롤러가 포함되어 있습니다. 이것의 문제는 각 NAV 컨트롤러가 단일 루트보기 컨트롤러 (즉, "계정"테이블을 공유해야한다는 것입니다. 트윗) - 이것은 작동하지 않는 것 같습니다. 테이블 컨트롤러를 두 번째 NAV 컨트롤러로 밀면 첫 번째에서 제거하는 것 같습니다. 다른 계정을 선택할 때 모든 서적 관리는 말할 것도없이 아마도 고통 일 것입니다.
올바른 방법으로 어떻게 구현해야합니까?
^1] : 해당 레벨의 탭 바 컨트롤러의 탐색 항목이 선택한 탭의 탐색 항목과 동기화되도록 탭 바 컨트롤러를 서브 클래싱해야합니다. self.tabBarController.navigationController
대신에 self.navigationController
.
해결책
두 개의 이전 답변이 제대로되었습니다 - 나는 사용하지 않습니다. UITabBarController
트윗에서. 관습을 작성하는 것은 매우 쉽습니다 XXTabBarController
(평범한 서브 클래스 UIViewController
) NAV 컨트롤러 스택으로 밀려나게되어 기쁘지만 여전히 "View Controller"철학에 의해 살아납니다. 계정 별보기의 각 "탭"(Tweets
/Replies
/Messages
) 자체 뷰 컨트롤러이며, 걱정하는 한 평원에 의해 화면에서 교환되고 있습니다. UITabBarController
.
다른 팁
트윗과 유사한 내비게이션 프레임 워크를 사용하는 앱을 만들고 있습니다. 내 블로그 에서이 작업을 수행하는 방법에 대한 게시물을 썼습니다. www.wiredbob.com 소스 코드에도 링크됩니다. 다른 프로젝트의 기초로 취하고 사용할 수있는 전체 템플릿입니다. 행운을 빕니다!
UIViewController에 Uitabbar를 추가 할 수 있습니다. 그렇게하면 실제로 UitabbarController를 밀어야 할 필요가 없으므로 Apple API의 지침을 유지합니다.
인터페이스 빌더에서 Uitabbar는 Cocoa Touch 라이브러리의 "Windows, Views & Bars"아래에 있습니다.
나는 두 앱에서 이것을한다. NavigationController 기반 앱에 탭 표시 줄을 추가하는 요령은 TabBarController를 사용하지 않는 것입니다. 보기에 탭 표시 줄을 추가하고 해당보기의 뷰 컨트롤러를 TabbardELegate로 만들고 View Controller 코드의 탭 표시 줄에서 사용자 선택에 응답하십시오.
탭 막대를 사용하여 탭 표시 줄에 추가보기를 추가하여 하위 뷰로, 다른 데이터 세트로 테이블보기를 다시로드하고 UIPICKERVIWOW 등을 다시로드합니다.
나는 지난 1 시간 동안 구현하기 위해 고군분투하고있었습니다. UITabBar
내 견해를 표시하려고 할 때 숨겨져 있기 때문입니다. 그런 다음 이것을 찾았습니다 게시하다:
기본적 으로이 코드 라인에 따라 탭 바 아래에 새 뷰를 삽입하십시오.
[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이 이런 식으로 지원하지 않는 문서의 어느 곳에서도 찾지 못했습니다. 누군가 나 에게이 경고에 대한 링크를 줄 수 있습니까?
이것이 진실이라면 Apple이 내 앱을 AppStore에 게시하는 것을 거부 할 수 있습니까?
-(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를 간단히 포함시켜 달성 할 수 있습니다. 스토리 보드에서 :
- ViewController를 드래그하십시오
- ViewController의 장면을 클릭하십시오
- 편집자 >> 내비게이션 컨트롤러에 포함됩니다.
- 동일한 ViewController의 버튼을 드래그하십시오.
- TabbarController를 드래그하십시오
- 푸시 Segue 동작을 통해 ViewController의 버튼을 TabbarController에 연결하십시오.
이 경우 TabbarController의 RootViewController 만 탐색 컨트롤러 스택에 있습니다. 모든 Tabbaritems는 상단에 내비게이션 바가 있으며 사용자는 선택한 Tabbaritem에 관계없이 언제든지 홈 화면으로 갈 수 있습니다.
이것은 내비게이션 컨트롤러 스택의 모든 뷰 콘트롤러에서 수행 할 수 있습니다.
작동하는 경우 다음 답변에 이미지와 코드를 게시 할 수 있도록 명성을 높이는 방법을 제안하십시오. :)
이 문제에 어떻게 접근했는지에 대한 블로그 게시물을 썼습니다. 저에게는 모달보기를 사용하는 것이 사용자 정의 탭 바 구현을 작성하는 것보다 간단한 솔루션이었습니다.
http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/