Переключение между Текстовыми полями при нажатии клавиши Return в Swift

Я разрабатываю приложение для iOS, и я хочу это, когда клавиша Return нажимается в моем iPhone, это направляет меня к следующему следующему текстовому полю.

Я нашел несколько подобных вопросов с превосходными ответами вокруг, но они все просто, оказывается, находятся в Objective C, и я ищу SWIFT-код, теперь это - то, что я имею вплоть до сих пор:

func textFieldShouldReturn(emaillabel: UITextField) -> Bool{
    return true
}

Это помещается в файл, это подключено и контроллер к UIView, который содержит текстовые поля, но я не уверен, является ли это правильным местом.

Я в основном плохо знаком с Swift, поэтому объясните каждый небольшой шаг, или мне удастся испортить его так или иначе. Также я использую последнюю версию XCode, если это имеет какое-либо значение.

Хорошо, таким образом, я испытал это и получил эту ошибку:
//could not find an overload for '!=' that accepts the supplied arguments

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let nextTag: NSInteger = textField.tag + 1
    // Try to find next responder
    let nextResponder: UIResponder = textField.superview!.viewWithTag(nextTag)!
    if (nextResponder != nil) {
        // could not find an overload for '!=' that accepts the supplied arguments

        // Found next responder, so set it.
        nextResponder.becomeFirstResponder()
    } else {
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
    }
    return false // We do not want UITextField to insert line-breaks.
}

Заранее спасибо приятели!

59
задан 15 August 2019 в 23:21

4 ответа

У меня есть хорошее решение для Вашего вопроса.

ШАГ:

1 - Набор Ваша клавиша Return от раскадровки.

enter image description here

2 - В Вашем быстром файле.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField.returnKeyType == .next {
            Email.resignFirstResponder()
            Password.becomeFirstResponder()
        } else if textField.returnKeyType == .go {
            Password.resignFirstResponder()
            self.Login_Action()
        }
        return true
    }

3 - не забывают устанавливать делегата Текстового поля.

Спасибо :)

1
ответ дан 1 November 2019 в 11:09

Если у Вас есть много компонентов текстового поля, мои - это, могло бы быть лучше использовать набор выхода, связав текстовые поля и установив клавишу Return от интерфейсного разработчика

@IBOutlet var formTextFields: [UITextField]!

override func viewDidLoad() {
  for textField in formTextFields {
    textField.delegate = self
  }
}

extension RegisterViewController: UITextFieldDelegate {
  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let componentIndex = formTextFields.firstIndex(of: textField) {
      if textField.returnKeyType == .next,
        componentIndex < (formTextFields.count - 1) {
        formTextFields[componentIndex + 1].becomeFirstResponder()
      } else {
        textField.resignFirstResponder()
      }
    }
    return true
  }
}
1
ответ дан 1 November 2019 в 11:09

Swift / Программно

class MyViewController: UIViewController, UITextFieldDelegate {

    let textFieldA = UITextField()
    let textFieldB = UITextField()
    let textFieldC = UITextField()
    let textFieldD = UITextField()

    var textFields: [UITextField] {
        return [textFieldA, textFieldB, textFieldC, textFieldD]
    }

    override func viewDidLoad() {
        // layout textfields somewhere 
        // then set delegate
        textFields.forEach { [110].delegate = self }
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if let selectedTextFieldIndex = textFields.firstIndex(of: textField), selectedTextFieldIndex < textFields.count - 1 {
            textFields[selectedTextFieldIndex + 1].becomeFirstResponder()
        } else {
            view.endEditing(true) // last textfield, dismiss keyboard directly
        }
        return true
    }
}
2
ответ дан 1 November 2019 в 11:09

Swift 4.2

Это [еще 114] Дженерик и Самым Легким Решение, можно использовать этот код с любым количеством TextFields. Просто наследуйте UITextFieldDelegate и обновите Тег Текстового поля согласно порядку и скопируйте эту функцию

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let txtTag:Int = textField.tag

    if let textFieldNxt = self.view.viewWithTag(txtTag+1) as? UITextField {
        textFieldNxt.becomeFirstResponder()
    }else{
        textField.resignFirstResponder()
    }

    return true
}
2
ответ дан 1 November 2019 в 11:09

Другие вопросы по тегам:

Похожие вопросы: