【问题标题】:Xcode Moving from StoryboardXcode 从 Storyboard 迁移
【发布时间】:2021-04-12 05:59:45
【问题描述】:

我有一个使用故事板的 Xcode 项目。

我有典型的设置,

  • 故事板中的转场
  • 从视图控制器调用 self.perform("..."....)
  • 然后调用“prepare(for segue: UIStoryboardSegue, sender: Any?)”,允许我在调用“viewdidload”之前在新视图控制器中写入变量

现在该项目正在发展,使用故事板变得不切实际。 我们正在采用代码方法从代码中加载视图。我们面临的问题是如何在调用“viewdidload”之前将数据传递到新视图,或者使用什么正确的流程。

我们正在使用

加载视图
    let nib = UINib(nibName: "TestView", bundle: nil)
    let view = nib.instantiate(withOwner: self, options: nil).first as! TestViewController
    view.delegate = self
    view.dataModel = TestViewDataModel()
    present(view, animated: true, completion: nil)  

我们遇到的问题是“实例化”调用 viewdidload,但理想情况下它需要来自“数据模型”的数据

谢谢

【问题讨论】:

  • “什么是正确的方法” - 一种有效的方法。好吧,这有点开玩笑,但归根结底,您需要能够开发最终适合您的工作流程。加载视图和加载视图控制器(通过代码)在工作流程方面的要求略有不同。您还应该考虑尝试解耦工作流,利用protocols 来定义调用者可以以独立方式与视图/控制器交互的可接受方式。过去我使用工厂风格的方法和“逻辑”控制器来管理工作流
  • “我们正在采用代码方法从代码中加载视图” 是的,但我怀疑加载 nib 是否会有所帮助。我建议完全在代码中创建/配置视图,而不是使用 Interface Builder。否则很难看出你认为你正在解决什么问题。毕竟,如果问题仅仅是故事板变得太大,您可以通过将其拆分为多个故事板并在它们之间使用故事板引用跳转来解决这个问题。所以问题一定是笔尖本身不好。
  • 添加到@matt 评论中,IB 只是一种设计 方式,可以在代码中执行您可以执行的操作。想想真正的“segue”是什么——是的,你不能在代码中作为“segue”来做。通常是导航,或者使用视图控制器堆栈。现在,NIB?这不是视图控制器 - 它只是一个视图。因此,如果您/我们采用代码方法,请从这些方面考虑。

标签: swift


【解决方案1】:

TestViewController 添加一个新的初始化程序,它接受您需要的任何数据作为参数。

在其中拨打super.init(nibName: "TestView", bundle: nil)UIViewController 的初始化程序将负责查找 nib,从中实例化自己,并将自己设置为所有者。

class TestViewController: UIViewController {

    let dataModel: TestViewDataModel

    init(dataModel: TestViewDataModel) {
        super.init(nibName: "TestView", bundle: nil)
        self.dataModel = dataModel
    }

    //...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多