How to assign an optional Binding parameter in SwiftUI?
What you want is an Optional Binding of a String, not a Binding of an Optional String. I don't think you can achieve that by using the @Binding annotation.
However, you don't need to used the annotation. You can just declare the variable as a Binding:
Your
@Binding var searchTxt: String?
then turns to this
var searchTxt: Binding<String?>
But this way the syntax lets you place the ? wherever you want. So if you move it to the end, after the Binding's closing tag, you have what you want.
var searchTxt: Binding<String>?
If you want to access the String inside your Binding, you have to use the wrappedValue property.
Text(searchTxt!.wrappedValue)
I have a UIViewControllerRepresentable
in order to use UIImagePickerController
. If you've ever used this image picker, you know that you need to image returned to be an optional. So in my ContentView
I declared:
@State var uiImage: UIImage?
...
if uiImage != nil {
Image(uiImage: $uiImage)
} else {
Rectangle()
}
And in my ImagePicker
(that's my SwiftUI
view) I have:
@Binding var uiImage: UIImage?
Works like a charm.
(The if
statement is pretty much psuedo-code, as I'm actually using an MTKView
and a CIImage
, but your get the drift - you use the optional just as you would anywhere else.)
@Binding var searchTxt: String?
init(searchTxt: Binding<String?>?) {
self._searchTxt = searchTxt ?? Binding.constant(nil)
}
Update: I prefer this one. 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 }
)
}