SwiftUI 次のTextfiledにreturnで行く
カスタムテキストフィールドで行うみたい
これでできるか?2つ以上ができなさそう
Placefolderがない
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
}
}
}