0

希望工具栏一直显示。

非常感谢任何帮助,因为这对用户体验来说是一个真正的拖累。

我已经为 TextView 的键盘添加了一个工具栏,如下所示。
但是,工具栏仅在应用程序运行一次后显示。这意味着工具栏不会在应用程序第一次运行时显示。该应用程序每次在初始加载后都能正常工作。

这是在 IOS 14.3、Xcode 12.3、Swift 5、iMessage 扩展应用程序上。在模拟器或真实设备上失败。

struct CustomTextEditor: UIViewRepresentable {
    @Binding var text: String
    private var returnType: UIReturnKeyType
    private var keyType: UIKeyboardType
    private var displayDoneBar: Bool
    private var commitHandler: (()->Void)?
    
    init(text: Binding<String>,
         returnType: UIReturnKeyType = .done,
         keyboardType: UIKeyboardType,
         displayDoneBar: Bool,
         onCommit: (()->Void)?) {
        self._text = text
        self.returnType = returnType
        self.keyType = keyboardType
        self.displayDoneBar = displayDoneBar
        self.commitHandler = onCommit
    }
    
    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        
        textView.keyboardType = keyType
        textView.returnKeyType = returnType
        textView.backgroundColor = .clear
        textView.font = UIFont.systemFont(ofSize: 20, weight: .regular)
        textView.isEditable = true
        textView.delegate = context.coordinator
        if self.displayDoneBar {
            let flexibleSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace,
                                                target: self,
                                                action: nil)
            let doneButton = UIBarButtonItem(title: "Close Keyboard",
                                             style: .done,
                                             target: self,
                                             action: #selector(textView.doneButtonPressed(button:)))
            
           let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 300, height: 50))
            toolBar.items = [flexibleSpace, doneButton, flexibleSpace]
            toolBar.setItems([flexibleSpace, doneButton, flexibleSpace], animated: true)
            toolBar.sizeToFit()
            textView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
            textView.translatesAutoresizingMaskIntoConstraints = true
            textView.inputAccessoryView = toolBar

        }

        return textView
    }

    func updateUIView(_ textView: UITextView, context: Context) {
        textView.text = text
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UITextViewDelegate {

        var parent: CustomTextEditor

        init(_ textView: CustomTextEditor) {
            self.parent = textView
        }

        func textViewDidChange(_ textView: UITextView) {
            self.parent.$text.wrappedValue = textView.text
        }
        func textViewDidEndEditing(_ textView: UITextView) {
            self.parent.$text.wrappedValue = textView.text
            parent.commitHandler?()
        }
    }
    
}

extension UITextView {
    @objc func doneButtonPressed(button:UIBarButtonItem) -> Void {
       self.resignFirstResponder()
    }
}

这就是它的称呼...

import SwiftUI
    
final class ContentViewHostController: UIHostingController<ContentView> {
        weak var myWindow: UIWindow?
        init() {
            super.init(rootView: ContentView())
        }
        required init?(coder: NSCoder) {
            super.init(coder: coder, rootView: ContentView())
        }
    }
let kTextColor = Color(hex: "3E484F")
let kOverlayRadius: CGFloat = 10
let kOverlayWidth: CGFloat = 2
let kOverlayColor = kTextColor
        
struct ContentView: View {
    @State var text = ""
            
    var body: some View {
        VStack {
            Spacer()
            CustomTextEditor(text: $text, returnType: .default, keyboardType: .default, displayDoneBar: true, onCommit: nil)
                        .foregroundColor(kTextColor)
                        .overlay(
                            RoundedRectangle(cornerRadius: kOverlayRadius)
                                .stroke(kOverlayColor, lineWidth: kOverlayWidth)
                        )
                        .frame(width: 200, height: 100, alignment: .center)
                    Spacer()
                }
            }
        }
        
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

From MessagesViewController...

override func willBecomeActive(with conversation: MSConversation) {
    let childViewCtrl = ContentViewHostController()
    childViewCtrl.view.layoutIfNeeded() // avoids snapshot warning?
        
    if let window = self.view.window {
        childViewCtrl.myWindow = window
        window.rootViewController = childViewCtrl
    }
}
4

0 回答 0