답변:
Swift 또는 Objective-C에서이 코드를 사용해보십시오
빠른
self.tabBarController.selectedIndex = 1
목표 -C
[self.tabBarController setSelectedIndex:1];
-setSelectedViewController:
.
내 의견이다 selectedIndex
또는 사용이 objectAtIndex
탭을 전환 할 수있는 가장 좋은 방법은 필요하지 않습니다. 탭을 재정렬하면 하드 코딩 된 인덱스 선택으로 인해 이전 앱 동작이 엉망이 될 수 있습니다.
전환하려는 뷰 컨트롤러의 객체 참조가있는 경우 다음을 수행 할 수 있습니다.
tabBarController.selectedViewController = myViewController
물론 반드시 myViewController
의 목록에 있는지 확인해야합니다 tabBarController.viewControllers
.
selectedIndex
UITabBarController 의 속성을 적절한 색인으로 설정하기 만하면 사용자가 탭 버튼을 탭한 것처럼보기가 변경됩니다.
selectedIndex
인덱스가 4보다 크면 설정 이 작동하지 않지만 작동하지 않습니다 selectedViewController
.
나는 Disco S2가 제안한 것을 시도했지만 가까이 있었지만 이것이 나를 위해 일한 결과입니다. 다른 탭 내에서 작업을 완료 한 후 호출되었습니다.
for (UINavigationController *controller in self.tabBarController.viewControllers)
{
if ([controller isKindOfClass:[MyViewController class]])
{
[self.tabBarController setSelectedViewController:controller];
break;
}
}
Stuart Clark의 솔루션과 같지만 Swift 3의 경우 :
func setTab<T>(_ myClass: T.Type) {
var i: Int = 0
if let controllers = self.tabBarController?.viewControllers {
for controller in controllers {
if let nav = controller as? UINavigationController, nav.topViewController is T {
break
}
i = i+1
}
}
self.tabBarController?.selectedIndex = i
}
다음과 같이 사용하십시오.
setTab(MyViewController.self)
내 tabController는 navigationController 뒤에있는 viewController에 링크되어 있습니다. navigationController가 없으면 다음과 같습니다.
if let controller is T {
IB를 연결하는 방법에 덜 의존하는 강력한 솔루션을 생각하면서 인덱스 대신 클래스별로 표시되는 탭을 지정할 수 있기를 원했습니다. Disco 또는 Joped의 솔루션이 작동하지 않아서이 방법을 만들었습니다.
-(void)setTab:(Class)class{
int i = 0;
for (UINavigationController *controller in self.tabBarContontroller.viewControllers){
if ([controller isKindOfClass:class]){
break;
}
i++;
}
self.tabBarContontroller.selectedIndex = i;
}
당신은 이것을 다음과 같이 부릅니다.
[self setTab:[YourClass class]];
이것이 누군가에게 도움이되기를 바랍니다.
내 문제는 조금 다릅니다. 첫 번째 tabBar에서 하나의 childViewController에서 두 번째 tabBar의 home viewController로 전환해야합니다. 위층에 제공된 솔루션을 사용하기 만하면됩니다.
tabBarController.selectedIndex = 2
그러나 두 번째 tabBar의 홈 페이지로 전환하면 내용이 보이지 않습니다. 그리고 디버깅 할 때 viewDidAppear, viewWillAppear, viewDidLoad는 호출되지 않습니다. 내 솔루션은 UITabBarController에 다음 코드를 추가하는 것입니다.
override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}
AppDelegate.m
파일 에서 사용 :
(void)tabBarController:(UITabBarController *)tabBarController
didSelectViewController:(UIViewController *)viewController
{
NSLog(@"Selected index: %d", tabBarController.selectedIndex);
if (viewController == tabBarController.moreNavigationController)
{
tabBarController.moreNavigationController.delegate = self;
}
NSUInteger selectedIndex = tabBarController.selectedIndex;
switch (selectedIndex) {
case 0:
NSLog(@"click me %u",self.tabBarController.selectedIndex);
break;
case 1:
NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
break;
default:
break;
}
}
Stuart Clark의 솔루션과 유사하지만 Swift 3의 경우 복원 식별자를 사용하여 올바른 탭을 찾으십시오.
private func setTabById(id: String) {
var i: Int = 0
if let controllers = self.tabBarController?.viewControllers {
for controller in controllers {
if let nav = controller as? UINavigationController, nav.topViewController?.restorationIdentifier == id {
break
}
i = i+1
}
}
self.tabBarController?.selectedIndex = i
}
다음과 같이 사용하십시오 (특정 viewController 및 복원 ID에 대해 스토리 보드에서 "인간"및 "로봇"도 설정해야하거나 스토리 보드 ID를 사용하고 "스토리 보드 ID 사용"을 복원 ID로 확인).
struct Tabs {
static let Humans = "Humans"
static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)
내 tabController는 navigationController 뒤에있는 viewController에 링크되어 있습니다. navigationController가 없으면 다음과 같습니다.
if controller.restorationIdentifier == id {
import UIKit
class TabbarViewController: UITabBarController,UITabBarControllerDelegate {
//MARK:- View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//Tabbar delegate method
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController
yourView.popToRootViewController(animated:false)
}
}