如何以编程方式触发方法“tabBarController:didSelectViewController:”?

Posted

技术标签:

【中文标题】如何以编程方式触发方法“tabBarController:didSelectViewController:”?【英文标题】:How to trigger method "tabBarController:didSelectViewController:" programmatically? 【发布时间】:2011-09-17 08:29:05 【问题描述】:

目前,我正在尝试通过以下代码以编程方式触发“didSelectViewController”方法:

self.tabController.selectedViewController 
        = [self.tabController.viewControllers objectAtIndex:NEWSTAB_INDEX];

但是,没有调用“didSelectViewController”方法。如何在不手动选择标签栏的情况下触发方法?

【问题讨论】:

注: tabBarController:didSelectViewController: 的行为随着 ios 3 的变化而改变。在 3 之前的版本中,此方法被调用以对所选视图控制器进行编程和用户启动的更改。在 iOS 3 及更高版本中,它仅在用户点击标签栏时调用,当您的代码以编程方式更改标签栏内容时不会调用它。 不知你为什么要达到这个目的。 【参考方案1】:
self.tabController.selectedIndex = NEWSTAB_INDEX;   // to actually switch to the controller (your code would work as well) - not sure if this does or not send the didSelectViewController: message to the delegate
[self.tabController.delegate tabBarController:self.tabController didSelectViewController:[self.tabController.viewControllers objectAtIndex:NEWSTAB_INDEX]];  // send didSelectViewController to the tabBarController delegate

【讨论】:

是的,它也适用于我。但是为什么你必须这样做呢?在我的例子中,UITabbarControllerDelegate 是一个单独的类 NSObject,并实现了委托方法。问题是,如果我以编程方式切换选项卡,则不会调用委托方法。如果您通过单击选项卡本身进行切换,则它可以工作。还不知道为什么会这样。 @Zsolt 这就是 Apple 对代理的看法(在用户交互时触发),这在某种程度上是有道理的。当以编程方式更改时,您已经知道它已更改,因此在某些情况下触发委托可能没有意义。 现在我想一想,如果我将委托方法放在应用委托中并将应用委托用作 tabbarcontroller 委托,则以编程方式更改选项卡将触发委托。所以你之前说的可能不对。【参考方案2】:

对于 Swift 3.0 您可以像这样以编程方式调用标签栏委托方法

self.tabController.selectedIndex = index (e.g. 0,1...etc)
self.tabController.delegate.tabBarController(self.tabController, didSelectViewController: self.tabController.viewControllers[index])

【讨论】:

以上是关于如何以编程方式触发方法“tabBarController:didSelectViewController:”?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式点击状态栏后如何触发“scrollsToTop”?

以编程方式触发 iOS 抖动事件

如何以编程方式触发 ngClick

如何以编程方式在 ExtJS 4 中触发 keydown 事件

如何以编程方式触发 NavigationLink?

单击按钮时如何以编程方式触发刷新primeNG数据表