【问题标题】:viewDidLoad not called未调用 viewDidLoad
【发布时间】:2013-03-14 16:46:16
【问题描述】:

故事板中的所有内容都使用非常标准的布局。

UISplitViewController 带有 UINavigationController 的详细视图控制器,它加载了我的自定义 UITableViewController。只有自定义 UITableViewController 中的 viewDidLoad 不会触发。

viewWillAppear 按预期触发,其他一切正常。视图显然已加载(唯一不起作用的是我在viewDidLoad 中设置的通知),我的回调在哪里?

我的viewDidLoad 方法... 断点,NSLog...如果执行了这个方法,这些东西不可能不给我反馈。

【问题讨论】:

  • 如果将详细视图控制器直接连接到 UITableVC 会发生什么。 UITableVC 中的 viewDidLoad 会触发吗?
  • 我刚刚取出了UINavigationController,对viewDidLoad的问题没有影响。
  • 这看起来像一个自定义的 TableView。您是否继承了 TableView,替换了默认的 tableview,然后在 IB 中为 TableView 和 UITableVC 更改了类,并确保 UITableVC 到 TableView 的连接是正确的。如果是,我建议断开连接,清理项目并将 Table VC 重新连接到视图。

标签: ios6 uiviewcontroller viewdidload


【解决方案1】:

我尝试通过使用拆分视图模板创建一个新项目来重新创建我的故事板。然后复制所有适当的视图控制器。它按预期工作。 (viewDidLoad 正常调用)。

我并排比较了我在项目之间的所有 IB 连接......没有区别。然后我拿走了我原来的项目,并一一删除了所有的连接,然后重新连接它们(与它们连接的完全相同的东西)。完成后,我运行代码,一切正常。 viewDidLoad 已调用。

我尝试在非工作的故事板版本和工作版本之间进行差异,因为没有什么不同的,但显然有些不同。我无法确定它的正面或反面 尽管 XML 的大部分内容是相同的,但许多位是 XML 文件的不同部分,这使得标准差异变得不切实际。这更像是一个拼图游戏,试图找到匹配的位,一个小时后我什么也没找到。

所以一个可怕的不令人满意的答案。它与 IB 相关,最有可能是出口(但我确实也重新输入了类名和东西......再次相同)。很可能是我的错误,而不是 Xcode 的错误,但看起来我无法确定确切的原因。

感谢您的建议,他们帮助我从各个方向寻找解决方案。

【讨论】:

  • 我也遇到了这种情况。我仍在尝试追查问题,但初步迹象表明 MediaPlayer 框架。我在故事板的根部只有一个标准视图控制器——一个 Xcode 单一视图应用程序模板(适用于 iPad)。我添加了一个依赖于 MediaPlayer 和 MobileCoreServices 的 View 子类,突然 viewDidLoad 没有在根视图控制器类上调用。我删除了两个框架和依赖项,并调用了 viewDidLoad。尝试单独添加 MobileCoreServices,没问题。尝试添加 MediaPlayer 并再次出现问题。在 sim 上进行测试。
  • 我不太确定“框架和依赖项”的全部含义。框架应该没有轴承。从框架中添加import 语句应该无关紧要。什么是变化?如果您要更换视图控制器的“父级”,请确保链上的每个类都记得调用 [super viewDidLoad];
  • 我的回答不是专门解决你的问题,而是解决viewDidLoad没有被调用的问题。你的情况可能非常不同。我可能应该把我的 cmets 放在这个问题上而不是这个答案上。无论如何,我所说的框架是指 MediaPlayer.framework、AudioToolbox.framework。当您将它们添加到您的项目中时,它们的类和方法将添加到您的编译产品中。我所说的依赖只是指我的项目中依赖它们的代码(所以我可以编译)。
  • 现在我正在做的一个项目同样的事情发生在我身上两次。与您为我工作的解决方案相同:删除segues,重新创建它们并且它可以工作。为什么?我也不知道。实际上,我唯一能想到的是我重构了一些类名,尽管不是停止加载的视图控制器的名称。去图吧。
【解决方案2】:

我怀疑您期望viewDidLoad 在它已经加载并且刚刚从主视图控制器更新时被调用。在这种情况下,它不必从 nib/storyboard 重新加载,因此不会调用 viewDidLoad

将日志语句放入viewDidLoad,你会看到它至少被调用了一次。

【讨论】:

  • 我在viewDidLoad 方法中同时设置了NSLog 和断点。它永远不会被调用。调用了“initWithCoder”,调用了“viewWillAppear”,但没有发生“viewDidLoad”。
  • 来自文档:“无论视图层次结构是从 nib 文件加载还是在 loadView 方法中以编程方式创建,都会调用此方法。”也许你有几个您的项目中有类似的 VC 并且正在将它们混合在一起?
  • 值得怀疑,因为我只有 3 个自定义视图控制器。 MasterViewControllerDetailViewControllerAttachmentViewController。这个东西几乎是拆分视图模板,默认的DetailViewController 变成了UITableViewController,最后一个只是单元点击的一个segue。我想我会尝试重新创建模板并放入我的类,看看会发生什么。
  • 你是不是直接打电话给loadView?这也阻止了对 loadView 的调用。
【解决方案3】:

检查视图控制器子类的名称是否与其他类冲突。

在我的例子中,我心不在焉地保留了自动生成的项目类前缀“MP”,因此项目的根视图控制器子类是 MPViewController。

MPViewController 没有在任何地方记录,但由于问题仅在链接到 MediaPlayer 框架时才发生,因此可以肯定的是,它是在某处定义的,并且在加载 Storyboard 时,应用程序创建了它的实例而不是我的自定义实例类。

【讨论】:

    【解决方案4】:

    您可能在创建项目后创建了 Storyboard 文件。如果是这样,您应该从 AppDelegate.m 文件中删除字符串:

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多