我正在try 用一些可选的Views构建一个定制的NavBar,比如一个搜索栏(但仅当视图需要显示它时).

基本上,我需要传递大约@State个带有@Binding个向下视图的属性.但我也需要它们是Optional个参数.

下面是一个例子:

struct NavBar: View {
    
    var isSearchable: Bool?
    
    @Binding var searchTxt: String
    @Binding var searchIsOn: Bool
    
    var navBarTitle: String
    var navBarAction: (() -> Void)?
    var navBarImage: String?
    
    init(navBarTitle: String, navBarAction: (() -> Void)? = nil, navBarImage: String? = nil, isSearchable: Bool? = false, searchTxt: (Binding<String>)?, searchIsOn : (Binding<Bool>)?) {
        self.navBarTitle = navBarTitle
        if(navBarAction != nil) {
            self.navBarAction = navBarAction!
        }
        if(navBarImage != nil) {
            self.navBarImage = navBarImage!
        }
        self.isSearchable = isSearchable
        
        self._searchTxt = (searchTxt != nil) ? (searchTxt!).binding : nil
        self._searchIsOn = (searchIsOn != nil) ? (searchIsOn!).binding : nil
        
        assert((navBarAction != nil) ? navBarImage != nil : true)
        assert((isSearchable! == true) ? (searchTxt!.value.count > 0) : true)
    }
// var body ....

}

我说的属性是searchIsOnsearchTxt.

无法分配"Binding"类型的值键入"Binding"

你知道我如何解决这个问题吗?

还是有更好的方法来做我想做的事?

推荐答案

@Binding var searchTxt: String?

init(searchTxt: Binding<String?>?) {
    self._searchTxt = searchTxt ?? Binding.constant(nil)
}

或者考虑一下:TextField("", text: $text ?? "default value")

https://stackoverflow.com/a/61002589/4728060

func ??<T>(lhs: Binding<Optional<T>>, rhs: T) -> Binding<T> {
    Binding(
        get: { lhs.wrappedValue ?? rhs },
        set: { lhs.wrappedValue = $0 }
    )
}

Swift相关问答推荐

自定义完整屏幕封面动画

防止NavigationLink自行返回导航视图

同步问题,发送Api Call之前未设置idToken

为什么我的引用类型对象在初始化后有3个强引用?

如何让ScrollView缩小到合适的大小,并在没有黑客攻击的情况下占用最小空间

从Firebase播放音频文件不起作用

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

NavigationLink和ObservableObject的动画片段

为什么这个快速代码不显示文本字段?

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

在 RealityKit 中创建转场

无法增加系统镜像的大小

展开 List 中的 HStack 以端到端但不是从上到下,因此看起来项目之间有更宽的空间

SwiftUI 文本被意外截断

为什么 `map(foo)` 和 `map{ foo($0) }` 返回不同的结果?

符合协议要求委托变量在 ios13 中可用

在 Swift 4 中实现自定义解码器

仅在 Swift 中创建 Setter

在 Swift 中强制崩溃的最简单方法

TabView 在切换选项卡时重置导航堆栈