SwiftUI inputAccesoryView Implementation

后端 未结 4 1004
感动是毒
感动是毒 2021-01-07 07:58

I am trying to implement an inputAccessoryView on a TextField in SwiftUI. The goal is to have a \"Done\" Button appear above the Keyboard which when pressed gets rid of the

4条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-07 08:36

    I use this code multi line textfield.

    SwiftUI
    Swift5
    Version 11.3 (11C29)

    struct MultiLineTextField: UIViewRepresentable {
        @Binding var text: String
        let onEditingChanged: (Bool) -> Void
    
        init(text: Binding, onEditingChanged: @escaping (Bool) -> Void = {_ in}) {
            self._text = text
            self.onEditingChanged = onEditingChanged
        }
    
        func makeCoordinator() -> MultiLineTextField.Coordinator {
            return MultiLineTextField.Coordinator(parent1: self)
        }
    
        func makeUIView(context: UIViewRepresentableContext) -> UITextView {
            let textView = UITextView()
    
            textView.isEditable = true
            textView.isUserInteractionEnabled = true
            textView.isScrollEnabled = true
    
            textView.font = .systemFont(ofSize: 20)
            textView.delegate = context.coordinator
            textView.text = self.text
    
            /******* toolbar add **********/
    
            let toolbar = UIToolbar()
            toolbar.setItems(
                [
                    UIBarButtonItem(
                        title: "Done",
                        style: UIBarButtonItem.Style.done,
                        target: self,
                        action: nil
                    )
                ]
                , animated: true
            )
            toolbar.barStyle = UIBarStyle.default
            toolbar.sizeToFit()
    
            textView.inputAccessoryView = toolbar
    
            /******* toolbar add **********/
    
            return textView
        }
    
        func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext) {
            if uiView.text != self.text {
                uiView.text = self.text
            }
        }
    
        class Coordinator: NSObject, UITextViewDelegate {
            var parent: MultiLineTextField
            let onEditingChanged: (Bool) -> Void
    
            init(parent1: MultiLineTextField, onEditingChanged: @escaping (Bool) -> Void = {_ in}) {
                self.parent = parent1
                self.onEditingChanged = onEditingChanged
            }
    
            func textViewDidChange(_ textView: UITextView) {
                self.parent.text = textView.text
            }
    
            func textViewDidBeginEditing(_ textView: UITextView) {
                onEditingChanged(true)
            }
    
            func textViewDidEndEditing(_ textView: UITextView) {
                onEditingChanged(false)
            }
        }
    }
    

提交回复
热议问题