swiftui - 导致导航链接初始化丢失的状态变量
问题描述
我在 aboutView(ContentView 的底部)的导航链接中遇到了一些奇怪的错误:
- 由于“私人”保护级别,aboutView 初始化程序不可访问
- 调用中缺少参数“useHomeCur”的参数
- 预期的表达式 Xcode 还建议我在 ContentView 中插入 ', useHomeCur: <#Bool#>'
我不会在任何其他视图中遇到这些错误。aboutView.swift 中没有发生错误。就好像 aboutView 是 ContentView 的子视图一样。它希望我在 ContentView 中定义一个 aboutView 状态参数。为什么?如果我在 aboutView 中输出状态参数和选项,效果会很好。
我也尝试过: .navigationBarItems(trailing: NavigationLink(destination: aboutView()) { Text("About"). 此编码消除了预期的表达式错误
iOS 14.0 Xcode 12.0.1 盖伦
struct ContentView: View {
@State private var activateAbout = false
var body: some View {
NavigationView {
VStack {
... menu navigation links
}
.font(.title)
.navigationBarTitle("blah blah blah", displayMode: .inline)
.background(
// hide programmatically activated link here !!
NavigationLink(destination: aboutView(), isActive: $activateAbout) { EmptyView()
)
.navigationBarItems(trailing: Button( action: {
// not add - only activate it here, otherwise it will not work
self.activateAbout = true
}) {
Text("About")
}
}
}
.onAppear(perform: loadCurrencies)
}
}
}
这里是关于查看>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
struct aboutView: View {
@EnvironmentObject var userData: UserData
@State private var useHomeCur: Bool
var body: some View {
NavigationView {
Form {
VStack (alignment: .center) {
Text("blah blah blah")
Text("blah blah blah")
}.font(.body)
Toggle(isOn: $useHomeCur) {
Text("Use this fancy feature")
}.padding()
NavigationLink(destination: docView()) {
Text("Documentation")
}
}.navigationBarTitle("About", displayMode: .inline)
}
}
}
解决方案
状态变量用于内部视图使用,因此应在内部初始化(并且将其设为私有是一种很好的做法)。如果您需要状态具有来自超大的初始值,那么在 init 中显式执行,例如
- 内部初始化的变体
struct aboutView: View {
@EnvironmentObject var userData: UserData
@State private var useHomeCur: Bool = false // << here !!
- 外部初始化的变体
struct aboutView: View {
@EnvironmentObject var userData: UserData
@State private var useHomeCur: Bool
init(useHomeCur: Bool = false) {
_useHomeCur = State(initialValue: useHomeCur) // << here !!
}
...
推荐阅读
- python - 将 JSON 数据过滤到 Python 变量中以供以后重用
- javascript - Ajax 和页面刷新
- python - 这个脚本有什么问题?该功能不会用新电子邮件替换旧电子邮件
- javascript - 如何在 jquery 或 javascript 中用变量字符串替换数组名
- .net - Azure App 服务在一段时间不活动后需要重新启动
- mdriven - 约束 - 受约束的目标
- android - Play Store App Device Catalog 说 Track: Production Status: Unsupported
- node.js - Node.js 命令在 Ubuntu 中引发错误
- javascript - 如何使用 DOM 操作将 onclick 属性添加到多个按钮
- c - 此正则表达式组合是否与 ipv4 地址匹配