【问题标题】:Adding child view to UITabBarController not call viewWillAppear将子视图添加到 UITabBarController 不调用 viewWillAppear
【发布时间】:2014-09-05 10:21:46
【问题描述】:

我有基于标签栏的应用程序(iOS 7.1 SDK)。当用户第一次启动应用程序时,我想显示一些登录屏幕。我决定使用视图控制器包含(这在标签栏控制器的第一个视图控制器中调用):

LoginViewController *vc = [LoginViewController new];
[self.tabBarController addChildViewController:vc];
[vc didMoveToParentViewController:self.tabBarController];
[self.tabBarController.view addSubview:vc.view];

但是有一些问题。 View 通常是可见的,但在 LoginViewController 中 viewWillAppear 和 viewDidAppear 永远不会被调用。我尝试在所有视图生命周期方法(viewDidLoad、viewWillAppear、viewDidAppear)中使用这段代码,但没有运气。我知道还有其他一些方法可以实现我想要做的事情。例如,将子控制器添加到标签栏控制器的第一个视图控制器并隐藏标签栏,效果很好,通常会调用 viewWillAppear 和 viewDidAppear。但正因为如此,我更加好奇——为什么将子视图控制器添加到标签栏控制器不能按预期工作?

【问题讨论】:

  • 您需要展示或推送视图控制器才能调用方法。仅将视图添加为子视图是行不通的。

标签: ios objective-c uitabbarcontroller childviewcontroller


【解决方案1】:

您需要呈现或推送视图控制器才能调用方法。仅将视图添加为子视图是行不通的。

在您的情况下,您可以显式调用 viewWillAppear、viewDidAppear 方法。

LoginViewController *vc = [LoginViewController new];
[self.tabBarController addChildViewController:vc];
[vc didMoveToParentViewController:self.tabBarController];
[self.tabBarController.view addSubview:vc.view];

[vc viewWillAppear];
[vc viewDidAppear];

【讨论】:

  • 感谢您的回答。但我认为显式调用这些方法并不是好的解决方案。当使用视图控制器包含时,它们应该被自动调用,对吧?正如我所说,当我在作为选项卡栏控制器中的视图控制器之一的普通视图控制器中使用我的代码时,一切都按预期工作。只有当我尝试将子视图控制器直接添加到标签栏控制器时,我才会遇到问题。
  • 将一个viewController的视图直接添加到另一个也不是一个好的实现。当您使用这样的系统时,您将不得不使用这样的解决方法。如果你想让方法自己调用,你需要正确呈现。
【解决方案2】:

它正在工作!

dispatch_async(dispatch_get_main_queue(), ^{
        [self.tabBarController setSelectedIndex:0];
        [self.tabBarController setSelectedIndex:1];
        [self.tabBarController setSelectedIndex:0];
    });

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2011-10-02
    • 2011-08-06
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多