我正在尝试使用一些可选的 Views
构建自定义 NavBar
,例如搜索栏(但仅当 View 需要显示它时)。
基本上,我需要通过 @Binding
将一些 @State
属性传递到 View 中。但我还需要它们是可选
参数。
这是一个例子:
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 ....
}
我所说的属性是 searchIsOn
和 searchTxt
。
但是执行赋值 self._searchTxt = searchTxt
或 self._searchIsOn = searchIsOn
会引发编译错误:
Cannot assign value of type 'Binding?' to type 'Binding'
您知道我该如何解决这个问题吗?
或者是否有更好的方法来完成我想做的事情?
最佳答案
@Binding var searchTxt: String?
init(searchTxt: Binding<String?>?) {
self._searchTxt = searchTxt ?? Binding.constant(nil)
}
更新:我更喜欢这个。 TextField("", text: $text ?? "默认值")
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 - 如何在 SwiftUI 中分配可选的绑定(bind)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163055/