繁体   English   中英

为什么我的标签栏控制器从活动视图控制器之外的视图控制器执行代码?

[英]Why does my tabbar controller execute code from a different view controller than the active one?

首先,我将两个视图控制器都设置为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从另一个窃取了该委托。

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

请注意,在正常情况下, viewDidLoad方法仅被调用一次。 (例如,由于内存警告而卸载视图控制器的视图时,可能会再次调用该视图,然后您再次访问视图控制器的视图,这将调用loadView / awakeFromNibviewDidLoad 。对此我不太确定。但在您的情况下:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM