首页 > 解决方案 > @ViewBuilder 在使用其他属性初始化时抛出错误

问题描述

我有一个使用@ViewBuilderSwiftUI 中的属性的自定义视图。

我还希望在构造视图的闭包旁边的初始化程序中需要一些其他属性。

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当我从此代码中删除该功能时,初始化程序起作用。

标签: iosxcodeswiftuiinitialization

解决方案


barStyle不是正常变量。你barStyle@Statevar 所以你应该需要使用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)
    }

推荐阅读