假设我的iPhone应用在一个标签页视图中显示UIButton
,我想让它在TabBarController
的标签栏中打开另一个标签页。我该如何编写代码来执行此操作?
我假设我卸载现有视图并加载特定的标签视图,但我不确定如何准确编写代码。
答案 0 :(得分:377)
在Swift或Objective-C中尝试此代码
<强>夫特强>
self.tabBarController.selectedIndex = 1
Objective-C
[self.tabBarController setSelectedIndex:1];
答案 1 :(得分:20)
请注意,标签从0开始编制索引。因此,以下代码段可以正常工作
tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];
转到栏中的第五个标签。
答案 2 :(得分:10)
我的观点是selectedIndex
或使用objectAtIndex
不一定是切换标签的最佳方式。如果您重新排序选项卡,硬编码索引选择可能会破坏您以前的应用程序行为。
如果您有要切换到的视图控制器的对象引用,则可以执行以下操作:
tabBarController.selectedViewController = myViewController
当然,您必须确保myViewController
确实位于tabBarController.viewControllers
列表中。
答案 3 :(得分:9)
您只需将UITabBarController上的selectedIndex
属性设置为适当的索引,就会像用户点击标签按钮一样更改视图。
答案 4 :(得分:3)
我尝试过迪斯科S2的建议,它很接近,但这最终为我工作了。在完成另一个标签内的操作后调用此方法。
for (UINavigationController *controller in self.tabBarController.viewControllers)
{
if ([controller isKindOfClass:[MyViewController class]])
{
[self.tabBarController setSelectedViewController:controller];
break;
}
}
答案 5 :(得分:2)
对于您可能正在移动标签的情况,这里有一些代码。
for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
[self.tabBarController setSelectedViewController:controller];
break;
}
}
答案 6 :(得分:1)
我希望能够指定哪个选项卡是按类显示而不是索引,因为我认为这是一个强大的解决方案,而不是依赖于如何连接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]];
希望这对某人有帮助
答案 7 :(得分:0)
在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;
}
}
答案 8 :(得分:0)
像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链接到navigationControllers后面的viewControllers。如果没有navigationControllers,它将如下所示:
if let controller is T {
答案 9 :(得分:0)
与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
}
像这样使用它(&#34;人类&#34;和#34;机器人&#34;还必须在故事板中设置特定的viewController及其恢复ID,或使用Storyboard ID并检查& #34;使用故事板ID&#34;作为恢复ID):
struct Tabs {
static let Humans = "Humans"
static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)
请注意我的tabController链接到navigationControllers后面的viewControllers。如果没有navigationControllers,它将如下所示:
if controller.restorationIdentifier == id {
答案 10 :(得分:0)
paste0
答案 11 :(得分:0)
我的问题有点不同,我需要从第一个tabBar中的一个childViewController切换到第二个tabBar的主viewController。我只是使用楼上提供的解决方案:
tabBarController.selectedIndex = 2
但是,当切换到第二个tabBar的主页时,内容是不可见的。当我调试viewDidAppear,viewWillAppear,viewDidLoad时,没有一个被调用。 我的解决方案是在UITabBarController中添加以下代码:
override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}