我有一个基于neil的答案的自定义视图,它有两个级别:MainContent
和SubviewContent
,都是View
s。
用户可以从单个MainContent
导航到许多SubviewContent
。这意味着我动态地创建目标视图的内容。
层次结构如下:
struct StackNavigationView<MainContent, SubviewContent>: View where MainContent: View, SubviewContent: View {
subView: () -> SubviewContent
//...
}
struct SomeView: View {
var body: some View {
StackNavigationView(/*init parameters*/) {
//MainView
}
}
private func subView(forIndex index: Int) -> AnyView {
//some stuff...
}
}
SubviewContent
是从MainContent
传递的方法构建的,并作为变量存储,如下所示:
let subView: () -> SubviewContent
在初始化过程中,我传递了一个@escaping
方法并将其赋值给变量subView
。
init(@ViewBuilder subView: @escaping () -> SubviewContent, /*more stuff*/) {
self.subView = subView
//more stuff...
}
该方法基于索引返回视图,如下所示:
private func subView(forIndex index: Int) -> AnyView {
switch index {
case 0: return AnyView(/*some content*/)
case 1: return AnyView(/*some content*/)
//etc...
default: return AnyView(ViewNotFound())
}
}
问题是,如果我传递一个需要参数的视图,参数必须是硬编码的. 否则参数为nil
,应用程序崩溃。
带参数的例子:
case 1: return AnyView( DestinationView(parameter: some_parameter) )
当用户尝试导航时,这会崩溃,因为some_parameter
是nil
。
同样的问题出现在optional
参数中。当打开包装时,它们是nil
。
我已经尝试删除@escaping
位来解决这个问题,但随后应用程序立即崩溃,因为没有参数可以传递(再次,它通过nil
,但出于不同的原因,显然)。
如何传递一个完全构造的View
只有在用户选择了导航目的地之后?
更新1
经过对问题的回顾和讨论,我认为更好的方法是:
如何在传递方法作为变量的同时维护方法内参数?
如果你只是想传递imageppaths/text,也许只是让子视图直接从其他地方读取它?
Class ParamsToPass {
static var data = [
"viewID" : [
["param1key": "param1value"]
["param2key": "param2value"]
]
]
}
关于你的更新:
如何在传递方法作为变量的同时维护方法内参数?
也许让方法返回你需要的参数?