【问题标题】:Why instantiateViewContoller is necessary?为什么实例化视图控制器是必要的?
【发布时间】:2018-03-19 14:28:37
【问题描述】:

为什么我不能使用类似的东西创建视图控制器对象 resultVC = ResultViewController() 而不是下面的方式。

        let storyboard = UIStoryboard (name: "Main", bundle: nil)
        let resultVC = storyboard.instantiateViewController(withIdentifier: "ResultViewController") as! ResultViewController

        // Communicate the match
        resultVC.match = self.match
        self.navigationController?.pushViewController(resultVC, animated: true)

【问题讨论】:

  • 你可以,但是当你这样做时,UIKit 会寻找一个与类 (ResultViewController.xib) 同名的 nib 进行实例化,因为你使用的是故事板,所以我不'不相信它会使用情节提要自动实例化它。
  • 确实,就像@YoCoh 所说,如果您有一个与主包中的视图控制器名称相同的 nib 文件,并且您没有用不同的名称覆盖您的 init(nibName:bundle:),那么您可以这样做名称和捆绑包。

标签: ios swift viewcontroller


【解决方案1】:

使用resultVC = ResultViewController() 将创建一个 ResultViewController 类型的视图控制器,但没有任何指向您的故事板的链接,这对您来说不太可能有任何用处(如果没有获得这些链接,您为什么要使用故事板?)。您需要从情节提要中实例化它以获得这些链接。

【讨论】:

    【解决方案2】:

    你使用这个方法来创建你想要的视图控制器对象 在您的应用程序中以编程方式操作和呈现。前 您可以使用此方法检索视图控制器,您必须 在接口中用适当的标识符字符串显式标记它 生成器。

    因此,您不仅要分配班级,还要将班级与Interface Builder 中的专用屏幕相关联。

    无论如何,您可以根据需要创建控制器 resultVC = ResultViewController(),但您应该在代码中创建所有 UI,而不是使用 Interface Builder

    【讨论】:

      【解决方案3】:

      一切都取决于你的逻辑。您可以通过三种基本方式创建UIViewController

      1. 故事板:你有故事板,设计你的 VC 并通过故事板实例化它。 在这种情况下,您必须告诉系统您的 VC 在哪个故事板中以及它的 ID 是什么。 正如你在上面的代码中所做的那样。

      2. Xib/Nib: 就像故事板一样,您可以使用xib/nib 来设计您的VC。这里只需要按 xib 名称分配 VC。

      3. 以编程方式:在这里您不需要任何类型的 xib/storyboard。您必须通过代码完成所有操作。您的 VC 设计将在您各自的 VC 文件中。在这里,您只需分配该文件。

      区别:Which is more efficient way? StoryBoard or XIB?

      如果你还不清楚,那就问吧。

      【讨论】:

        猜你喜欢
        • 2017-11-22
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        • 2016-01-08
        • 2014-11-07
        相关资源
        最近更新 更多