我有一个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
}
}
}
}
1条答案
按热度按时间gg0vcinb1#
使用reloadinputviews应该使输入视图更改在文本视图已经是第一响应者时生效,这是选择更改委托方法的情况。