如何在 SwiftUI 中分配可选的 Binding 参数? [英] How to assign an optional Binding parameter in SwiftUI?

查看:27
本文介绍了如何在 SwiftUI 中分配可选的 Binding 参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用一些可选的 Views 构建自定义 NavBar,例如搜索栏(但前提是视图需要显示它).

I'm trying to build a custom NavBar with some optional Views, like a searchbar (but only if the view needs to display it).

基本上,我需要将一些带有 @Binding@State 属性传递给视图.但我也需要它们是 Optional 参数.

I need to pass some @State properties with @Binding down the views, basically. But I also need them to be Optional parameters.

这是一个例子:

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.但是执行分配 self._searchTxt = searchTxtself._searchIsOn = searchIsOn 会引发编译错误:

The properties I'm talking about are searchIsOn and searchTxt. But doing the assignment self._searchTxt = searchTxt or self._searchIsOn = searchIsOn throws a compile error:

无法分配绑定"类型的值?输入绑定"

Cannot assign value of type 'Binding?' to type 'Binding'

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

Do you know how could I resolve this issue?

或者有更好的方法来做我想做的事情吗?

Or is there a better way to do what I'm trying to do?

推荐答案

@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 }
    )
}

这篇关于如何在 SwiftUI 中分配可选的 Binding 参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆