当前位置: 首页 > 知识库问答 >
问题:

如何在 SwiftUI 中分配可选的绑定参数?

曾河
2023-03-14

我正在尝试构建一个自定义的< code>NavBar,带有一些可选的< code >视图,比如searchbar(但前提是视图需要显示它)。

基本上,我需要在视图中传递一些带有@绑定的@State属性。但我也需要它们是可选的参数。

下面是一个示例:

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 会引发编译错误:

无法将类型“绑定?”的值分配给类型“绑定”

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

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

共有3个答案

弘康安
2023-03-14

我有一个< code > UIViewControllerRepresentable ,以便使用< code > UIImagePickerController 。如果你曾经使用过这个图像拾取器,你知道你需要图像返回到一个可选的。因此,在我的< code>ContentView中,我声明:

@State var uiImage: UIImage?

...

if uiImage != nil {
    Image(uiImage: $uiImage)
} else {
    Rectangle()
}

在我的ImagePicker(这是我的SwiftUI视图)中,我有:

@Binding var uiImage: UIImage?

很管用。

(if语句几乎是伪代码,因为我实际上使用的是MTKView,以及CIImage,但你的意思是-你可以像在其他地方一样使用可选的。)

岳锦
2023-03-14

你要的是一个字符串的可选绑定,不是可选字符串的绑定。我不认为您可以通过使用@Binding注释来实现这一点。

但是,您不需要使用注释。您可以将变量声明为绑定:

@Binding var searchTxt: String?

然后转向这个

var searchTxt: Binding<String?>

但是通过这种方式,语法允许您放置 ?随心所欲。因此,如果您将其移动到末尾,在绑定的结束标记之后,您将拥有所需的内容。

var searchTxt: Binding<String>?

如果要访问绑定中的字符串,必须使用wrappedValue属性。

Text(searchTxt!.wrappedValue)
燕鸿文
2023-03-14
@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 }
    )
}
 类似资料:
  • 这是我的可选装订 所以现在当我尝试调用这个构造函数时: 我得到了这个错误: 绑定

  • 我有一个视图,有时用于浏览数据,有时用于选择数据。 当用于浏览时,它由NavigationLink呈现。 当用于选择数据时,它以模式表的形式显示,并通过将绑定布尔值isPresented设置为false来关闭,因此我可以使用表函数onDismiss。 然而,在浏览模式下,我需要一种方法来跳过初始化isPresent绑定布尔值。正确的方法是view init()上的可选参数,但我尝试的所有内容都会抛

  • 我想在 init 方法中默认 returnGroup 为 nil,但是我收到以下错误 Nil 默认参数值无法转换为类型 'Binding' 想知道如何将绑定设置为 nil ?

  • 如何拥有绑定类型的可选参数

  • (macOS 10.15 beta 和 Xcode 11 beta 5) 我正在使用的SwiftUI教程(https://www.raywenderlich.com/3715234-swiftui-getting-started#toc-anchor-005)包括以下视图: 该视图是在与另一个视图相同的文件中声明的,可以作为该视图的组件进行预览。 正如在教程中使用的那样,它可以工作,但我后来将视图

  • 可以为url使用可选参数吗?例如,如果未传递参数,则路径将匹配相同的组件; 在实现它的时候,我需要声明两个路由和来匹配同一个组件。