为什么我的tabbar控制器从不同的视图控制器执行代码而不是活动的?

时间:2012-10-17 02:55:14

标签: ios uiviewcontroller delegates uitabbarcontroller ios6

首先,我将两个viewcontrollers都设置为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的代码,而不是活动的那个?

编辑*这几乎就好像一个viewController从其他人那里偷走了代表。

1 个答案:

答案 0 :(得分:1)

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

请注意,viewDidLoad方法在正常情况下只调用一次。 (例如,当视图控制器的视图因内存警告而被卸载时,可能会再次调用它,然后再次访问视图控制器的视图,调用loadView / awakeFromNib和{{ 1}}。虽然我对这种情况并不完全确定。)在你的情景中:

  1. 首次打开OptionsViewController - 标签栏控制器的委托是OptionsViewController
  2. 首次打开CalculatorsViewController - 标签栏控制器的委托现在是CalculatorsViewController
  3. 返回OptionsViewController - 标签栏控制器的委托仍然是CalculatorsViewController,因为viewDidLoad不再被调用
  4. 如果您必须更改代理,则可以使用viewDidLoad方法进行更改。