假设我在iPhone应用程序的一个选项卡视图中有一个
我假设我要卸载现有视图并加载特定的选项卡视图,但我不确定如何编写代码。
UIButton
,并且我想让它打开TabBarController
标签栏中的另一个选项卡。 我该如何编写代码来实现这一点?我假设我要卸载现有视图并加载特定的选项卡视图,但我不确定如何编写代码。
UIButton
,并且我想让它打开TabBarController
标签栏中的另一个选项卡。 我该如何编写代码来实现这一点?请使用以下的Swift或Objective-C代码进行尝试
Swift
self.tabBarController.selectedIndex = 1
Objective-C
[self.tabBarController setSelectedIndex:1];
请注意,标签页的索引从0开始计数。因此,以下代码片段可以正常工作:
tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];
跳转到标签栏中的第五个标签。
我的观点是,selectedIndex
或使用objectAtIndex
并不一定是切换选项卡的最佳方式。如果您重新排列选项卡,则硬编码的索引选择可能会影响您以前的应用程序行为。
如果您有要切换到的视图控制器的对象引用,可以执行以下操作:
tabBarController.selectedViewController = myViewController
当然,你必须确保 myViewController
真的在 tabBarController.viewControllers
的列表中。
selectedIndex
属性设置为适当的索引,视图将会像用户点击选项卡按钮一样更改。我尝试了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)
if let controller is T {
我的问题略有不同,我需要从第一个标签栏中的一个子视图控制器切换到第二个标签栏的主页视图控制器。我只需使用楼上提供的解决方案:
tabBarController.selectedIndex = 2
然而,当它切换到第二个标签栏的主页时,内容是不可见的。当我进行调试时,viewDidAppear、viewWillAppear和viewDidLoad都没有被调用。
我的解决方案是在UITabBarController中添加以下代码:
override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}
如果您需要移动标签页,这里是一些代码。
for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
[self.tabBarController setSelectedViewController:controller];
break;
}
}
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)
}
}
我希望能够通过类而不是索引来指定要显示的选项卡,因为我认为这样可以提供一个更健壮的解决方案,减少对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]];