【问题标题】:loadView of UIViewController not called未调用 UIViewController 的 loadView
【发布时间】:2011-09-11 19:42:17
【问题描述】:

我想以编程方式在 NavigationController 中设置 UIViewController,但是会调用 loadView 或 viewDidLoad 方法。

这是我在应用委托中的代码:

MyViewController *viewController = [[MyViewController alloc] init];
UIView *view = [[UIView alloc] initWithFrame:window.frame];
viewController.view = view;

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];

[window addSubview:[navController view];
[window makeKeyAndVisible];

当我启动应用程序时,我看到一个导航栏,但没有调用 loadView。我错过了什么? 我认为 loadView 在你调用view后会被调用

编辑

MyViewController *viewController = [[MyViewController alloc] init];
[viewController view];  // doesn't look right?

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];

[window addSubview:[navController view];
[window makeKeyAndVisible];

针对 Jonah 的评论进行了编辑,但仍然没有调用 loadView。

【问题讨论】:

    标签: iphone ios uiview uiviewcontroller


    【解决方案1】:

    当控制器的 view getter 被调用并且其视图当前为 nil 时,UIViewController 将创建其视图(通过从 ni​​b 加载或实现 -loadView)。

    在显示的代码中,您从不调用视图属性的 getter,只调用它的 setter。

    此外,您正在从您的应用委托中分配控制器的视图。 UIViewControllers 应按需创建自己的视图,而不是由其他类提供。当您意识到控制器卸载其视图并尝试重新创建它以响应内存警告时,这种方法将给您带来问题。让你的控制器创建它的视图,不要尝试传递它。

    【讨论】:

    • 关于你的第二句话,分配视图,你的意思是我的第二和第三行代码,对吧?这就说得通了。但在这种情况下,我该如何称呼 getter?
    • [viewController view] 调用视图的 getter,但您不需要直接这样做。您添加视图控制器的UINavigationController 将在某个时候调用该getter,以便将控制器的视图添加到视图层次结构中。你能分享你的视图控制器实现吗?听起来您还有其他事情要做。
    • 它基本上是 Xcode 中的空 UIViewController 模板,但除了 init 之外没有调用任何 (view) 方法。在那里我尝试设置这样的视图: - (id) init{ self((self = [super init])){ UIView *view = [[UIView alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; self.view = 视图; [查看发布]; } 返回自我; }
    • 如果您将控制器的视图设置在 -loadView 之外,那么您没有遵循 UIViewController 的合同,也不应该期望调用 -loadView(因为控制器已经有视图)或-viewDidLoad(因为不需要加载视图)。您应该只在 'loadView 中分配 UIViewController 的视图属性。
    • 我尝试-init 作为最后的手段,因为 loadView 一开始就没有被调用。因此,如果我再次删除 init 中的设置部分,-loadView-viewDidLoad 也不会被调用。我真的很感谢你的帮助。 @乔纳
    【解决方案2】:

    也许你没有遇到这个问题......但前几天我遇到了同样令人恼火的麻烦......我的 UIViewController 中没有调用 loadView、viewDidLoad 和 viewWillAppear。

    我的问题很简单,但如果你不是很小心的话,很难抓住它。而不是写

    -(void) loadView
    

    我写道:

    -(void) loadview
    

    请注意,这不会触发任何警告。 loadView 中“V”和“v”的区别很容易被忽略。显然,由于 loadView 没有被调用,viewDidLoad/viewWillAppear 也不会被调用,因为没有加载视图(我没有使用任何 nib..以编程方式创建视图)。

    -安舒

    【讨论】:

      【解决方案3】:

      另一个值得注意的问题是,如果你定义了一个

      @synthesize view;
      

      如果您的实现中没有匹配的 @property,这可能会导致调用视图控制器返回 nil,并且不会调用您的 loadView 方法。

      【讨论】:

      • 啊哈!这个得到了我。由于过度的查找/替换操作,我最终在一个类中得到了一个“@synthesize 视图”,没有意识到这一点,突然之间我的视图完全空白,因为 loadView 再也没有被调用过。这很难追踪。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2011-05-21
      • 2011-07-22
      • 1970-01-01
      相关资源
      最近更新 更多