更新 SwiftUI 中的 inputAccessoryView (UIViewRepresentable)

Posted

技术标签:

【中文标题】更新 SwiftUI 中的 inputAccessoryView (UIViewRepresentable)【英文标题】:Update inputAccessoryView in SwiftUI (UIViewRepresentable) 【发布时间】:2021-07-26 11:18:03 【问题描述】:

我想使用 SwiftUI 在键盘上方显示搜索结果。为此,我为UITextField 制作了一个UIViewRepresentable,并相应地设置了inputAccessoryView

一切都正确显示,但inputAccessoryView 没有更新。

 struct V_ToolbarTextField<Content: View>: UIViewRepresentable 
    
    var title: String
    @Binding var text: String
    var keyType: UIKeyboardType
    
    var toolbarContent: Content
        
    init(_ title: String,
         text: Binding<String>,
         keyType: UIKeyboardType = .alphabet,
         toolbarContent: Content) 
        self.title = title
        self._text = text
        self.keyType = keyType
        self.toolbarContent = toolbarContent
    
    
    
    func makeUIView(context: Context) -> UITextField 
        let textfield = UITextField()
        textfield.keyboardType = keyType
        textfield.placeholder = title

        let textUIKit = UIHostingController(rootView: toolbarContent)
        textUIKit.view.frame = CGRect(x: 0, y: 0, width: 800, height: 60)

        textfield.inputAccessoryView = textUIKit.view
        return textfield
    
    
    func updateUIView(_ uiView: UITextField, context: Context) 
        uiView.text = text
    

这就是我传递inputAccessoryView 内容的方式:

 V_ToolbarTextField("Title",
                    text: $gameNameFilter, 
                    toolbarContent: 
                     viewContainingSearchResults())

我尝试绑定toolbarContent 并在updateUIView() 中设置inputAccessoryView。我也尝试过创建一个 Coordinator 类并将UITextField 的委托设置为它,希望使用UITextFieldDelegate 函数来更新它,但我不知道是哪一个,我无法设置正确委派。

【问题讨论】:

你能显示viewContainingSearchResults()的代码 @cedricbahirwe 我已经用一个简单的 TextView() 尝试过,即使绑定的文本没有更新,所以这不是问题 【参考方案1】:

我无法让它工作,并放弃了inputAccessoryView,而是使用底部的工具栏VStack。显示键盘时我将其隐藏。

@State var keyboardOpen = false

VStack 
    
    // everything else...
    
    if (keyboardOpen) 
        V_FilteredGameList(filter: vm.gameName, action:  game in
            vm.setExistingGame(game: game)
            hideKeyboard()
        )
    

.onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification))  _ in
        keyboardOpen = true

.onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification))  _ in
        keyboardOpen = false

【讨论】:

以上是关于更新 SwiftUI 中的 inputAccessoryView (UIViewRepresentable)的主要内容,如果未能解决你的问题,请参考以下文章

如何正确处理更新视图中的选取器(SwiftUI)

更新列表中的一行 (SwiftUI)

SwiftUI 中的上下文菜单未更新

SwiftUI 中的状态变量未更新

更新 SwiftUI 列表中的选定对象

如何使用 SwiftUI 更新 Firebase 中的集合?