【问题标题】:Create UIViewController instance from xib vs from single vc storyboard从 xib 与从单个 vc 故事板创建 UIViewController 实例
【发布时间】:2021-08-10 05:53:42
【问题描述】:

我正在阅读一个 Xcode 项目,该项目有很多只包含视图控制器的情节提要,仅用于创建 VC 实例。过去,我只是将 xib 用于相同的目的。

无论哪种方式都可以很好地在代码中创建实例。只是想知道单个 vc 故事板方法是否比 xib 提供任何优势或劣势。喜欢听到任何想法。

【问题讨论】:

  • 我只将 xib 用于视图,故事板仅用于视图控制器

标签: ios xcode storyboard


【解决方案1】:

不,故事板中的单个 vc 与 xib 相比没有任何优势,因为当故事板包含许多 vc 来显示应用程序屏幕的流程并将应用程序划分为模块时,故事板将具有意义

【讨论】:

    【解决方案2】:

    故事板允许您以 xib 无法实现的方式同时查看多个视图。例如,您可以在故事板场景中创建一个表格视图控制器,然后创建和布局每个单元格内联到表格视图。这样,您可以看到每个单元格相对于其他单元格的布局。

    此外,如果行数和节数不是动态的,您还可以创建静态表视图。一个很好的例子是设置屏幕,其中行数和节数不会改变。您实际上可以为每行中的标签创建插座并直接设置其内容。这使您可以避免实现表视图委托和数据源回调来填充数据。

    但是,这些都是相当具体的情况,因此使用故事板并不总是具有优势。如果您想在不同的屏幕上重复使用一个单元格,您需要使用 xib,而不是将该单元格复制并粘贴到每个情节提要场景中。

    此外,我更倾向于使用 SwiftUI,因为您倾向于两全其美(编程和视觉布局)。例如,我已经能够在三分之一的代码中重新创建复杂的设置屏幕和时间。而且维护起来要容易得多。 YMMV。

    【讨论】:

      【解决方案3】:

      就个人而言,我喜欢使用故事板,无论它包含single ViewController 还是multiple ViewControllers。故事板对我来说似乎是一个图解。单一 VC 的故事板对我来说意味着死胡同,这意味着你无法离开 VC。如果你在一个团队中工作,多个故事板是一个加分点,以防与其他人发生合并冲突。因此,如果我使用多个故事板,我不会犹豫。

      但在创建视图的情况下,我使用XIB。在不同的 ViewController 中重用它们更容易。请注意,您不会在多个地方使用同一个 viewController,而是使用视图。

      【讨论】:

        【解决方案4】:

        .xib 和 Storyboard 都使用解码器进行初始化。至于性能提升,如果有的话,它完全可以忽略不计。您实际上并不需要实例化,尽管如果您是一个视觉型的人,那么这样做可能会有一些好处。如果您只是制作一个简单的控制器,您可以将变量保存在任何文件中并使用代码进行实例化。 即:

        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
           
                let vc = UIViewController()
                vc.view.backgroundColor = .blue
        
                self.window?.rootViewController = vc      
        
                let textField = UITextField(frame: CGRect(x: vc.view.frame.midX, y: vc.view.frame.midY, width: 80, height: 20))
           
                //put layout constraints here
                textField.backgroundColor = .white
                textField.delegate = self
            
                vc.view.addSubview(textField)
                vc.view.bringSubviewToFront(textField)
            
                guard let _ = (scene as? UIWindowScene) else { return }
        }
        

        您还可以从另一个控制器显示该控制器或推送到导航堆栈。

        【讨论】:

          【解决方案5】:

          缺点:

          1. 在创建控制器实例时将要求您创建其故事板实例将增加开发工作量
          2. 管理更多故事板文件,单人本可以做到这一点
          3. 记住故事板的名称以及视图控制器
          4. 将它们固定在某个地方会增加开发工作量和成本
          5. 项目中的更多文件将看起来像项目中的一团糟
          6. 如果不小心处理,导航到不同的 viewController 可能会发生冲突,也会导致应用程序崩溃。

          优势

          1. 将像 xib 文件一样立即加载情节提要 这是我能想到的唯一优势

          【讨论】:

            猜你喜欢
            • 2012-02-29
            • 1970-01-01
            • 2017-04-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-29
            • 2016-12-15
            • 1970-01-01
            相关资源
            最近更新 更多