【问题标题】:segue loading viewcontroller but not displaying it继续加载视图控制器但不显示它
【发布时间】:2012-02-03 11:52:26
【问题描述】:

从 iPad 应用程序中的代码调用 segue 时,我在显示视图控制器时遇到问题。

我在 IB 中通过 Ctrl 将 segue 设置从一个视图控制器拖到另一个视图控制器,使用

标识符:viewDocumentSegue,样式:Modal,演示:默认,过渡:默认

然后我使用第一个视图控制器调用 segue

[self performSegueWithIdentifier:@"viewDocumentSegue" sender:nil];

并使用

将变量传递给第二个视图控制器
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UIViewController *destination = segue.destinationViewController;

    if ([destination respondsToSelector:@selector(setFileURL:)]) {
        [destination setValue:fileName forKey:@"fileURL"];
    }
}

第二个视图控制器确实被加载了,因为我在 viewDidLoad viewWillAppearviewDidAppear 中的 NSLogs 显示在控制台中,但没有显示任何内容。

我认为第二个视图控制器的视图位于视图层次结构中的某个位置。但是如何强制它到顶部呢?

编辑

这是界面截图(有些地方需要涂黑)。我添加了一些解释结构的注释。希望它会有所帮助。

(我还不能上传图片,所以这里有一个链接) http://www.linfoots.com/Screenshot.jpg

有什么建议吗?

谢谢,

理查德

【问题讨论】:

  • iPhone 还是 iPad?相关的模态表示和模态上下文设置是什么?你说“堆栈”——这一切都发生在导航控制器内吗?
  • 对不起,我应该更具体。我已经编辑了原始帖子。这是一个 iPad 应用程序,我应该说视图层次结构不是堆栈。我认为模态演示是在 Storyboard 和 segue 框架中处理的。我是故事板的新手,所以仍在努力适应它们。
  • 好的,现在我们知道您使用的是 iPad。还有什么?您在自定义父视图控制器中吗?描述故事板或显示它的屏幕截图。没有人可以从您所说的内容中重现此问题。
  • 感谢您的耐心,马特。我现在添加了一个屏幕截图,其中包含一些正在发生的事情的注释。我还听取了您的建议,即使用相关的视图控制器和 UI 元素创建一个新项目来复制该应用程序,并且它运行良好。因此,我将把应用程序简化为基础,看看是否能找到罪魁祸首。

标签: objective-c ios storyboard


【解决方案1】:

您没有提供我要求的其他信息,因此无法详细回答您的问题。我建议你做的是用两个视图控制器创建一个全新的项目。以相同的方式将它们连接到情节提要中。您会看到您正在尝试做的事情实际上应该可以正常工作。一旦你确信了这一点,你就可以回去看看你遇到问题的项目有什么不同。

编辑:

好的,感谢您的屏幕截图。看起来您正在尝试将情节提要与父视图控制器结合使用,正如我在第二条评论中所猜测的那样。这并不容易,因为情节提要对您的父视图控制器的子视图一无所知。使用多个情节提要或根本不使用情节提要会更快乐。

现在我们来解决使用父视图控制器的问题。你没有问这个问题,但它可能是你问题的核心。正确管理子视图控制器至关重要。请参阅我书中的讨论:

http://www.apeth.com/iOSBook/ch19.html#_container_view_controllers

必须每次都跳这个精致的舞蹈,否则事情就不会顺利:

当一个视图控制器成为你父视图控制器的子视图时:

  • 您在父视图控制器上调用 addChildViewController:。子节点会自动添加到父节点的 childViewControllers 数组中,该数组会保留它。
  • 如果这就是添加子视图控制器的含义,您可以将子视图控制器的视图放入您的界面。
  • 您将 didMoveToParentViewController: 发送给子视图控制器,并将父视图控制器作为其参数。

当视图控制器不再是父视图控制器的子视图时:

  • 您将 willMoveToParentViewController: 发送给带有 nil 参数的孩子。
  • 您从界面中删除子视图控制器的视图,如果这就是删除子视图控制器的含义的话。
  • 您将 removeFromParentViewController 发送给孩子。子对象会自动从父对象的 childViewControllers 数组中移除,从而释放它。

最后,当您进行模态转换时,父链中的definesPresentationContext 变得至关重要,以便模态视图知道要在界面中替换哪个视图。我书中的这个可下载示例演示了必要的区别:

https://github.com/mattneub/Programming-iOS-4-Book-Examples/tree/master/convertedToIOS5/p476containerController2

【讨论】:

  • 感谢马特,这帮助很大。我现在有一个实际工作的应用程序:) 无论如何,由于子视图控制器的实现似乎过于复杂,我已将它们从应用程序中删除,并仅以模态方式显示每个视图,无论是否动画。最后它实际上使整个界面变得更加简单,这只能是一件好事。我浏览了你的 iOS 5 书籍,它似乎比我目前拥有的书籍更全面,并且一定会在它发布时购买一本。再次感谢您的帮助。
  • 很高兴我能帮上忙,但你当然必须完成所有工作。 :) 对我来说,我给出的最重要的建议是“做一个简单的项目”。我一直在使用这种技术,向自己展示应该如何工作,而不会增加我的实际应用程序的复杂性。它既快速又简单,但尝试的人却很少。
  • @matt 这不是为 matt 的书做广告的地方,但实际上在阅读了大约 50 本书 iOS 主题之后,这本书是最好的。它帮助我阐明了 iOS 最重要的部分,尤其是视图控制器概念的基础知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多