Панель инструментов с «Предыдущая» и «Следующая» для клавиатуры - PullRequest
0 голосов
/ 12 мая 2018

Я пытался реализовать эту панель инструментов, где только кнопка «Далее» включена, когда верхний textField является firstResponder, и только кнопка «Предыдущая» активна, когда нижний textField является firstResponder.

Это вроде работает, но мне нужно выполнить свой собственный код, получив доступ к предыдущим, следующим и готовым методам действий кнопок в других классах (например, делегатам)

Заранее спасибо за ваши предложения ..

extension UIViewController {

func addInputAccessoryForTextFields(textFields: [UITextField], dismissable: Bool = true, previousNextable: Bool = false) {
for (index, textField) in textFields.enumerated() {

 let toolbar: UIToolbar = UIToolbar()
  toolbar.sizeToFit()
  var items = [UIBarButtonItem]()
  if previousNextable {
    let previousButton = UIBarButtonItem(image: UIImage(named: "Backward Arrow"), style: .plain, target: nil, action: nil)
    previousButton.width = 30
    if textField == textFields.first {
      previousButton.isEnabled = false
    } else {
      previousButton.target = textFields[index - 1]
      previousButton.action = #selector(UITextField.becomeFirstResponder)
    }

    let nextButton = UIBarButtonItem(image: UIImage(named: "Forward Arrow"), style: .plain, target: nil, action: nil)
    nextButton.width = 30
    if textField == textFields.last {
      nextButton.isEnabled = false
    } else {
      nextButton.target = textFields[index + 1]
      nextButton.action = #selector(UITextField.becomeFirstResponder)
    }
    items.append(contentsOf: [previousButton, nextButton])
  }

  let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
  let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: view, action: #selector(UIView.endEditing))
  items.append(contentsOf: [spacer, doneButton])
  toolbar.setItems(items, animated: false)
  textField.inputAccessoryView = toolbar
}
  }
}

Я звоню из другого класса как:

let field1 = UITextField()
let field2 = UITextField()
addInputAccessoryForTextFields([field1, field2], dismissable: true, previousNextable: true)

1 Ответ

0 голосов
/ 12 мая 2018

Хотя я не уверен на 100%, что понимаю ваш вопрос, вот что:

Из других классов вы хотите вызывать действия ваших кнопок, но ваши действия установлены в UITextField.becomeFirstResponder и UIView.endEditing.

Вместо непосредственного вызова этих методов создайте свои собственные методы, которые должны вызывать действия, и поместите эти вызовы в эти методы.

В addInputAccessoryForTextFields (...) измените цель и действие предыдущего элемента управления на:

previousButton.target = self
previousButton.action = #selector(handlePreviousButton)

Теперь добавьте новый метод:

@objc func handlePreviousButton()
{
    // you'll need to associate the previous button to a specific text field 
    // and hang onto that association in your class, such as in a property named textFieldRelatedToPreviousButton.
    self.textFieldRelatedToPreviousButton.becomeFirstResponder()  
}

Теперь вы можете вызывать handlePreviousButton () напрямую из любого места в вашем классе, если хотите, или даже из других классов.

Обновление

Я только что заметил, что вы расширяете UIViewController.Таким образом, вы не можете добавить хранилище, добавив свойство.Вы можете добавить хранилище через objc_setAssociatedObject, а затем получить его через objc_getAssociatedObject, однако, чтобы обойти это.См. этот SO или этот SO для получения подробной информации об этом.Таким образом, вы можете, например, «прикрепить» textField к вашему предыдущему кнопке, чтобы вы могли получить к нему доступ через метод handlePreviousButton (), который вы добавляете в свое расширение.И вы можете передать в предыдущем параметре previousButton в качестве параметра (отправителя) функцию handlePreviousButton ().

Update 2

Еще один подход, который необходимо учитывать, - это использование тега кнопки.свойство для хранения значения тега связанного textField.(т.е. каждая кнопка и связанный с ней textField будут иметь одинаковое значение тега).Поэтому в handlePreviousButton (sender: UIBarButtonItem) вы перебираете все дочерние элементы UITextField вашего self.view и находите того, чей тег соответствует sender.tag.Затем вы можете делать то, что вам нужно, с этим UITextField.

...