【问题标题】:Why does my tabbar controller execute code from a different view controller than the active one?为什么我的标签栏控制器执行来自与活动视图控制器不同的视图控制器的代码?
【发布时间】:2012-10-07 05:51:24
【问题描述】:

首先,我将两个视图控制器都设置为 UITabBarController 委托。两者都是标签栏控制器的一部分。我通过将以下代码放入每个 viewDidLoad 来做到这一点:

self.tabBarController.delegate = self;

然后我在 CalculatorsViewController 中添加了以下委托方法:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
[self presentCalculatorsView];
}

presentCalculators 视图仅显示同一视图控制器中的子视图。

我还在 OptionsViewController 中添加了以下委托方法:

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {

    [self presentHomeScreen];

}

同样,此方法只是在 viewController 中显示另一个子视图。

我遇到的问题是,仅当我不访问 CalculatorsViewController 时才会调用 OptionsViewController presentHomeScreen 方法。一旦我访问了应用程序中的 CalculatorsViewController 然后返回到 OptionsViewController,

[self presentHomeScreen]

永远不会被调用。事实上,它似乎仍然从 CalculatorsViewController 调用该方法。我用 NSLog 语句对其进行了测试。

知道为什么一种方法会覆盖另一种方法吗?或者为什么标签栏按钮从另一个 viewController 执行代码,而不是处于活动状态的那个?

EDIT* 就好像一个视图控制器从另一个视图控制器“窃取”了委托。

【问题讨论】:

    标签: ios uiviewcontroller delegates uitabbarcontroller ios6


    【解决方案1】:

    通过在每个viewDidLoad 方法上调用self.tabBarController.delegate = self;,您基本上是在告诉标签栏控制器使用放弃当前委托并使用当前视图控制器作为委托。

    注意viewDidLoad方法在正常情况下只调用一次。 (例如,当您的视图控制器的视图由于内存警告而被卸载时,可能会再次调用它,然后您再次访问视图控制器的视图,它调用loadView/awakeFromNibviewDidLoad。我'不过,我对这种情况并不完全确定。)在你的情况下:

    1. 第一次打开 OptionsViewController - 标签栏控制器的委托是 OptionsViewController
    2. 第一次打开 CalculatorsViewController - 标签栏控制器的委托现在是 CalculatorsViewController
    3. 返回 OptionsViewController - 选项卡栏控制器的委托仍然是 CalculatorsViewController,因为 viewDidLoad 不再被调用

    如果您必须更改委托,可以在 viewWillAppear 方法中进行。

    【讨论】:

    • 感谢您的精彩解释。这确实是解决方案。
    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多