【问题标题】:How to create object instance for detail view in SwiftUI如何在 SwiftUI 中为详细视图创建对象实例
【发布时间】:2019-07-02 20:59:16
【问题描述】:

我想将经典的 iOS 工作流程与 List —> 详细视图屏幕一起使用。而且我想不出在打开列表视图和在列表视图和详细视图之间移动时创建对象的确切一个实例的方法。通常我会使用跟随模式。


var detailVC = UIStoryboard.initiateDetailViewController()
detailVC.objectToEdit = MyObject(val1: "SomeVal", val2: "SomeAnotherVal")
detailVC.present()

所以这没关系。我正在创建 VC,手动分配应该为 DetailView 存储数据的对象,为其分配新对象,然后将其推送到导航堆栈。

但在 swiftUI 中我无法这样做。

PresentationButton(destination: MyDetailViewController()) {
    Text("Add new object")
}

上面的模式将失败,因为它会创建 1 个新的 MyObject,即使它只是呈现 ListView() 本身。在点击该按钮并关闭 DetailView 视图后,它将创建另外 2 或 3 个对象实例。

其他按钮和工具,如NavigationLink.presentation()(实际上我不知道 SwiftUI 中还有什么其他导航模式)都是一样的。

因此,我发现添加新数据对象的唯一方法是使用控制流和布尔变量修改当前视图,但我认为这两种架构的用户体验都非常差。

那么你能建议我在 SwiftUI 中为这个案例提供什么好的模式吗?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    首先,直接回答您的问题,

    您可以使用Bindings 或BindableObjects 来控制整个 SwiftUI 应用程序中的数据流。这个话题已经讨论过很多次了,所以我不会重复它,我会为你指出一些资源。

    This WWDC video on data flow with SwiftUI 应该是您首先看到的。它将很好地概述您需要了解的内容。如果不更详细地了解您项目中的代码到底是什么,除了您会知道使用@Binding@ObjectBinding@EnvironmentObject@State 中的哪一个,但this article 可能会有所帮助你想办法。最后,here 是 Apple 的关于状态和数据流的文档,这是学习前面提到的主题细节的另一个很好的资源。

    另一种选择

    根据您的要求,听起来您想要 UIKit 的 UISplitViewController 的 SwiftUI 实现。您可以使用UIViewControllerRepresentable 自己实现它,也可以使用someone has already created 实现。

    我还为前面提到的UISplitViewController 的 SwiftUI 实现创建了一个包装器,它不太灵活,但易于使用、快速设置,并提供了不错的功能,例如可选的搜索栏和完全处理数据的能力在“主”(您的列表)和“详细”视图之间流动。您可以查看here(它仍在进行中,因此使用风险自负)。如果您需要一个无需太多自定义且易于快速设置的简单 SplitView,此选项最适合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      相关资源
      最近更新 更多