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

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

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

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

【问题讨论】:

  • 注: tabBarController:didSelectViewController: 的行为随着 iOS 3 的变化而改变。在 3 之前的版本中,此方法被调用以对所选视图控制器进行编程和用户启动的更改。在 iOS 3 及更高版本中,它仅在用户点击标签栏时调用,当您的代码以编程方式更改标签栏内容时不会调用它。
  • 不知你为什么要达到这个目的。

标签: objective-c ios uiviewcontroller uitabbarcontroller


【解决方案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])

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2010-12-16
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多