Ответ 1
Попробуйте этот код в Swift или Objective-C
стриж
self.tabBarController.selectedIndex = 1
Objective-C
[self.tabBarController setSelectedIndex:1];
Скажем, у меня есть UIButton
в одной вкладке в моем приложении iPhone, и я хочу, чтобы он открыл другую вкладку в панели вкладок TabBarController
. Как написать код для этого?
Я предполагаю, что я выгружаю существующее представление и загружаю определенное представление табуляции, но я не уверен, как правильно писать код.
Попробуйте этот код в Swift или Objective-C
стриж
self.tabBarController.selectedIndex = 1
Objective-C
[self.tabBarController setSelectedIndex:1];
Обратите внимание, что вкладки индексируются начиная с 0. Таким образом, следующий фрагмент кода работает
tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];
переходит на пятую вкладку в панели.
Вы можете просто установить свойство selectedIndex
в UITabBarController на соответствующий индекс, и представление будет изменено так же, как пользователь нажал кнопку вкладки.
Мое мнение состоит в том, что selectedIndex
или использование objectAtIndex
не обязательно лучший способ переключить вкладку. Если вы измените порядок своих вкладок, выбор индекса с жестким кодированием может испортиться с вашим прежним поведением приложения.
Если у вас есть ссылка на объект контроллера просмотра, с которым вы хотите переключиться, вы можете сделать:
tabBarController.selectedViewController = myViewController
Конечно, вы должны убедиться, что myViewController
действительно находится в списке tabBarController.viewControllers
.
Я попробовал, что предложил Disco S2, это было близко, но это то, что в конечном итоге работало для меня. Это вызвано после завершения действия внутри другой вкладки.
for (UINavigationController *controller in self.tabBarController.viewControllers)
{
if ([controller isKindOfClass:[MyViewController class]])
{
[self.tabBarController setSelectedViewController:controller];
break;
}
}
В случаях, когда вы можете перемещать вкладки, вот какой-то код.
for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
[self.tabBarController setSelectedViewController:controller];
break;
}
}
Я хотел бы указать, какая вкладка была показана классом, а не индексом, поскольку я думал, что это сделано для надежного решения, которое в меньшей степени зависит от того, как вы подключаете 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]];
Надеюсь, что это поможет кому-то
Использовать в файле 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;
}
}
Как и решение Стюарта Кларка, но для 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 ссылается на viewControllers за навигационными контроллерами. Без navigationControllers это выглядело бы так:
if let controller is T {
Как и решение 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 и его идентификатора восстановления, или используйте идентификатор раскадровки и отметьте "использовать идентификатор раскадровки" в качестве идентификатора восстановления):
struct Tabs {
static let Humans = "Humans"
static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)
Обратите внимание, что моя tabController ссылается на viewControllers за навигационными контроллерами. Без navigationControllers это выглядело бы так:
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)
}
}
Моя проблема немного отличается, мне нужно переключиться с одного childViewController в 1-й tabBar на домашний viewController 2-й tabBar. Я просто использую решение, предоставленное наверху:
tabBarController.selectedIndex = 2
Однако, когда он переключился на домашнюю страницу 2-й вкладки, контент становится невидимым. И когда я отлаживаю, viewDidAppear, viewWillAppear, viewDidLoad, ни один из них не вызывается. Я решил добавить следующий код в UITabBarController:
override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}