SwiftUI - Как перемещаться по TextFields, нажав на кнопку возврата с клавиатуры? - PullRequest
1 голос
/ 26 сентября 2019

Я работаю с SwiftUI's TextField View.В основном у меня есть 2 вопроса,

1) В Swift мы можем установить Клавиша возврата (черты ввода текста) до Next для TextField из раскадровки, как это верно?Для этого какой модификатор использовать в SwiftUI?

enter image description here

2) У меня есть два текстовых поля, как перейти к следующему текстовому полю, когда я нажимаюкнопка возврата / перехода с клавиатуры?

Может ли кто-нибудь помочь с этим или любой другой альтернативой для выполнения этой функции?

Мой вопрос о SwiftUI, а не UIKit one:)

Anyпомощь будет высоко ценится !!

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Чтобы решить две проблемы, вам нужно работать с UIKit из SwiftUI .Во-первых, вам нужно настроить TextField , используя UIViewRepresentable .Вот пример кода для тестирования, хотя код не такой элегантный.Бьюсь об заклад, будет более надежное решение.

  1. Внутри настроенного TextFieldType был установлен тип возврата клавиатуры.
  2. Используя методы привязки объекта и делегата textFieldShouldReturn , View может фокусировать клавиатуру путем обновления переменных привязки.

Вот пример кода:

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
        }

    }
}

Выход: enter image description here

0 голосов
/ 26 сентября 2019

Вы не можете, в SwiftUI пока нет понятия цепочки респондента.Вы не можете программно инициировать фокусировку на любом View, потому что они на самом деле не сами представления, а просто структуры, которые описывают, как должны быть настроены представления.Я думаю, что в конечном итоге он может быть выставлен через EnvironmentValues (например, обрезание строки, автокоррекция и т. Д.), Но в настоящее время он не существует.

...