我想将经典的iOS工作流程与列表->详细视图屏幕一起使用。而且我不知道在打开列表视图并在列表视图和详细信息视图之间移动时创建对象的确切一个实例的方法。通常我会使用跟随模式。
var detailVC = UIStoryboard.initiateDetailViewController()
detailVC.objectToEdit = MyObject(val1: "SomeVal", val2: "SomeAnotherVal")
detailVC.present()
所以没关系。我正在创建VC,手动分配应为DetailView存储数据的对象,向其分配新对象,然后将其推入导航堆栈。
但是在swiftUI中,我无法这样做。
PresentationButton(destination: MyDetailViewController()) {
Text("Add new object")
}
上面的模式将失败,因为即使仅显示MyObject
本身也会创建1个新的ListView()
。轻按该按钮并关闭DetailView
视图后,它将创建该对象的另外2或3个实例。
其他按钮和工具,例如NavigationLink
,.presentation()
(实际上我不知道SwiftUI中的任何其他导航模式)最终都是相同的。
所以我发现添加新数据对象的唯一方法是使用控制流和布尔变量来修改当前视图,但是我认为这两种架构的用户体验都非常差。
那么您能为我在SwiftUI中为这种情况提供任何好的模式吗?
答案 0 :(得分:1)
首先,直接回答您的问题,
您可以使用Binding
或BindableObject
来控制整个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且无需太多自定义且易于快速设置,则此选项是最佳选择。