SwiftUI 次のTextfiledにreturnで行く

2020年2月11日

カスタムテキストフィールドで行うみたい

これでできるか?2つ以上ができなさそう

Placefolderがない

ios – SwiftUI – How to navigate through TextFields by clicking on return button from keyboard? – Stack Overflow

import SwiftUI

struct KeyboardTypeView: View {
    @State var firstName = ""
    @State var lastName = ""
    @State var focused: [Bool] = [true, false]

    var body: some View {
        Form {
            Section(header: Text("Your Info")) {
                TextFieldTyped(keyboardType: .default, returnVal: .next, tag: 0, text: self.$firstName, isfocusAble: self.$focused)
                TextFieldTyped(keyboardType: .default, returnVal: .done, tag: 1, text: self.$lastName, isfocusAble: self.$focused)
                Text("Full Name :" + self.firstName + " " + self.lastName)
            }
        }
}
}



struct TextFieldTyped: UIViewRepresentable {
    let keyboardType: UIKeyboardType
    let returnVal: UIReturnKeyType
    let tag: Int
    @Binding var text: String
    @Binding var isfocusAble: [Bool]

    func makeUIView(context: Context) -> UITextField {
        let textField = UITextField(frame: .zero)
        textField.keyboardType = self.keyboardType
        textField.returnKeyType = self.returnVal
        textField.tag = self.tag
        textField.delegate = context.coordinator
        textField.autocorrectionType = .no

        return textField
    }

    func updateUIView(_ uiView: UITextField, context: Context) {
        if isfocusAble[tag] {
            uiView.becomeFirstResponder()
        } else {
            uiView.resignFirstResponder()
        }
    }

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

    class Coordinator: NSObject, UITextFieldDelegate {
        var parent: TextFieldTyped

        init(_ textField: TextFieldTyped) {
            self.parent = textField
        }

        func updatefocus(textfield: UITextField) {
            textfield.becomeFirstResponder()
        }

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

            if parent.tag == 0 {
                parent.isfocusAble = [false, true]
                parent.text = textField.text ?? ""
            } else if parent.tag == 1 {
                parent.isfocusAble = [false, false]
                parent.text = textField.text ?? ""
         }
        return true
        }

    }
}

一応、以下でできたかな

//テキスト

TextFieldTyped2(keyboardType: .default, returnVal: .next,placeholder: "When?", tag: 0, text: self.$when, isfocusAble: self.$focused ,isFirstResponder:true,viewShowed: true)}


//カスタムテキスト 改行で次のテキストに行きたい
struct TextFieldTyped2: UIViewRepresentable {
    
    //private let tmpView = WrappableTextField()
    
    let keyboardType: UIKeyboardType
    let returnVal: UIReturnKeyType
    var placeholder:String?
    var changeHandler:((String)->Void)?
    var tag: Int
    @Binding var text: String
    @Binding var isfocusAble: Bool
    
    
    
    var isFirstResponder: Bool = false
    var viewShowed:Bool = false

    func makeUIView(context: UIViewRepresentableContext) -> UITextField {
        
        let textField = UITextField(frame: .zero)
        textField.keyboardType = self.keyboardType
        textField.returnKeyType = self.returnVal
        textField.placeholder = placeholder
        textField.tag = self.tag
        textField.text = self.text
        textField.delegate = context.coordinator
        textField.autocorrectionType = .no
        textField.clearButtonMode = .whileEditing
        
        //done
        let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: textField.frame.size.width, height: 44))
        let doneButton = UIBarButtonItem(title: NSLocalizedString("Done", comment: ""), style: .done, target: self, action: #selector(textField.doneButtonTapped(button:)))
        toolBar.items = [doneButton]
        let flexibleItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
        toolBar.setItems([flexibleItem,doneButton], animated: true)
        textField.inputAccessoryView = toolBar

        return textField
    }

    func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext) {
        
        
        uiView.text = text
        if isFirstResponder && !context.coordinator.didBecomeFirstResponder  {
            //uiView.becomeFirstResponder()
            context.coordinator.didBecomeFirstResponder = true
        }
        
    }

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

    class Coordinator: NSObject, UITextFieldDelegate {
        var parent: TextFieldTyped2
        
        var didBecomeFirstResponder = false
        
        //DataUpdateView.isEnabledUpdate = true

        init(_ textField: TextFieldTyped2) {
            self.parent = textField
        }
        
//ここがポイント
        func textFieldDidChangeSelection(_ textField: UITextField,shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            //DispatchQueue.main.async {
                self.parent.text = textField.text!
            //}
            return true
        }
        
        func textFieldDidBeginEditing(_ textField: UITextField) {
            //isEnabledUpdate = false
        }
        
        func textFieldShouldEndEditing(_ textField: UITextField,shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            self.parent.text = textField.text!
            return true
        }
        
        func textFieldDidEndEditing(_ textField: UITextField) {
            //DispatchQueue.main.async {
            self.parent.text = textField.text!
            //}
        }
        

        func textFieldShouldReturn(_ textField: UITextField) -> Bool {

             let nextTag = textField.tag + 1
                     
                     //textField.resignFirstResponder()
            self.parent.text = textField.text!
                    
                    //let nextField:UITextField = textField.viewWithTag(1) as! UITextField
                     
           if let nextField:UITextField = textField.superview?.superview?.superview?.superview?.superview?.viewWithTag(nextTag) as? UITextField {
                    //if nextTag == 1 {
                        //isfocusAble = true
                         //parent.text = textField.text ?? ""
                         nextField.becomeFirstResponder()
                         //nextField.resignFirstResponder()
            
            
            } else if textField.tag == 5 {
            
            textField.resignFirstResponder()
                } else {
                         //isfocusAble = false
                         //parent.text = textField.text ?? ""
                         //textField.resignFirstResponder()
                         //textField.becomeFirstResponder()
                         print("else")
                         
                }
                return true
                }

    }
}