ios - @ViewBuilder 在使用其他属性初始化时抛出错误
问题描述
我有一个使用@ViewBuilder
SwiftUI 中的属性的自定义视图。
我还希望在构造视图的闭包旁边的初始化程序中需要一些其他属性。
import Foundation
import SwiftUI
public enum NavigationBarStyle {
case title
case dismiss
case pop
case popAndDismiss
}
public struct NavigationBar <TitleView: View>: View {
//MARK: View Model
@State var barStyle: NavigationBarStyle
@Binding var showView: Bool
@Binding var pushView: Bool
var titleView: TitleView
//MARK: Body
public var body: some View {
titleView
}
//MARK: Init
public init(showView: Binding<Bool>?, pushView: Binding<Bool>?, style: NavigationBarStyle = NavigationBarStyle.dismiss, @ViewBuilder titleView: @escaping () -> TitleView) {
//Compiler error in initializer
self.titleView = titleView()
self.barStyle = style
self._showView = showView ?? .constant(true)
self._pushView = pushView ?? .constant(true)
}
}
struct NavigationBar_Previews: PreviewProvider {
static var previews: some View {
NavigationBar(showView: nil, pushView: nil) {
Text("Title")
}
}
}
但是,此代码会产生编译器错误。
Variable 'self.barStyle' used before being initialized
我有点困惑。@ViewBuilder
当我从此代码中删除该功能时,初始化程序起作用。
解决方案
barStyle
不是正常变量。你barStyle
是@State
var 所以你应该需要使用State(initialValue:
.
public init(showView: Binding<Bool>?, pushView: Binding<Bool>?, style: NavigationBarStyle = NavigationBarStyle.dismiss, @ViewBuilder titleView: @escaping () -> TitleView) {
//Compiler error in initializer
self.titleView = titleView()
self._barStyle = State(initialValue: style) //< == Here
self._showView = showView ?? .constant(true)
self._pushView = pushView ?? .constant(true)
}
推荐阅读
- f# - 使用 bigint 查找扩展 F# 数组
- dpdk - DPDK rte_eth_tx_burst() 可靠性
- nginx - Nginx - 是否可以知道选择了哪个服务器?
- java - Java:JSON 使用 GSON 进行映射
- java - Android ndk-build 命令失败
- view - 如何制作像 WheelView 这样的循环项目列表?
- c++ - 如何在 OpenGL 中进行 2D 缩放(GLFW,很高兴)?
- html - 相当于 SVG 中的背景位置百分比 (%)
- javascript - 使用 JavaScript 使用 WooCommerce REST API
- gradle - 为什么命令行与dependsOn中的任务解析不同?