ios 如何隐藏一个UITextView的键盘而不辞职第一响应者?

ybzsozfc  于 2023-06-25  发布在  iOS
关注(0)|答案(1)|浏览(142)

我有一个UITextView Package 在一个UIViewRepresentable中。
我现在尝试做的是显示一个工作表而不是键盘来格式化所选文本,就像iOS Notes应用程序一样。

到目前为止,我可以显示工作表,但我不能保持UITextView的可编辑性和关闭键盘在同一时间。
我试着在委托类中替换textView.inputView,但看起来只有在makeUIView中替换时才有效。
有办法做到吗?
以下是我目前为止的代码:

struct EditorView: UIViewRepresentable {
    @ObservedObject var model: EditorModel
    
    let textView = UITextView()
    
    init(model: EditorModel) {
        self.model = model
    }
    
    func makeUIView(context: Context) -> UITextView {
        textView.allowsEditingTextAttributes = true
        textView.delegate = context.coordinator
        textView.keyboardDismissMode = .interactive
        textView.alwaysBounceVertical = true
        textView.font = .preferredFont(forTextStyle: .body)
        
        let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: textView.frame.size.width, height: 44))
        let boldButton = UIBarButtonItem(
            title: "Format text",
            image: UIImage(systemName: "textformat"),
            primaryAction: UIAction(title: "Format text", handler: { UIAction in
                model.isTextFormatSheetVisible = true
                textView.inputView = UIView() // This doesn't work
            })
        )
        toolBar.setItems([boldButton], animated: true)

        textView.inputAccessoryView = toolBar
        
        return textView
    }
    
    func updateUIView(_ textView: UITextView, context: Context) {
        textView.attributedText = model.attributedText
        textView.selectedRange = model.selectedRange
        
        if (model.isTextFormatSheetVisible) {
            textView.inputView = UIView()
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, UITextViewDelegate {
        private var parent: EditorView
        
        init(_ parent: EditorView) {
            self.parent = parent
        }
        
        func textViewDidChange(_ textView: UITextView) {
            parent.model.attributedText = textView.attributedText
            parent.model.selectedRange = textView.selectedRange
        }
        
        func textViewDidChangeSelection(_ textView: UITextView) {
            DispatchQueue.main.async {
                self.parent.model.selectedRange = textView.selectedRange
            }
        }
    }
}
gg0vcinb

gg0vcinb1#

使用reloadinputviews应该使输入视图更改在文本视图已经是第一响应者时生效,这是选择更改委托方法的情况。

相关问题