【问题标题】:Toolbar with "Previous" and "Next" for keyboard带有“上一个”和“下一个”键盘的工具栏
【发布时间】:2018-05-12 05:33:35
【问题描述】:

我一直在尝试实现这个工具栏,当顶部的 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)

【问题讨论】:

  • 您的问题是,您没有获得上一个和下一个按钮?正确的?还是别的什么?
  • @AnkitJayaswal 我想在与委托方法相同的其他类中的上一个、下一个按钮操作方法中执行我自己的代码

标签: ios swift uibarbuttonitem uitoolbar


【解决方案1】:

虽然我不是 100% 确信我理解你的问题,但这里是:

您想从其他类调用按钮的操作,但您的操作设置为 UITextField.becomeFirstResponder 和 UIView.endEditing。

与其直接调用这些方法,不如创建自己的操作应该调用的方法,并将这些调用放入这些方法中。

在 addInputAccessoryForTextFields(...) 中将 previousButton 的目标和动作更改为:

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 获取它,以解决此问题。有关详细信息,请参阅 this SO 或 this SO。因此,例如,您可以将文本字段“附加”到您的 previousButton,以便您可以通过添加到扩展程序的 handlePreviousButton() 方法访问它。你也可以将previousButton作为参数(发送者)传递给handlePreviousButton()。

更新 2

要考虑的另一种方法是使用按钮的标签属性来存储相关文本字段的标签值。 (即每个按钮及其相关的 textField 将具有相同的标记值)。因此,在 handlePreviousButton(sender:UIBarButtonItem) 中,您循环遍历 self.view 的所有 UITextField 子项,并找到其标签与 sender.tag 匹配的那个。然后你就可以对那个 UITextField 做你需要的了。

【讨论】:

  • 感谢@Smartcat 的回复。没有了解如何将前一个按钮关联到特定的文本字段(“self.textFieldRelatedToPreviousButton”)。您能否提供更多信息。谢谢
  • 谢谢@Smartcat .. 我用 var stringProperty:UITextField { get { return objc_getAssociatedObject(self, &AssociatedObjectHandle) 试过了! UITextField } set { objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } 用于关联,但它总是返回 nil。它说“在展开可选值时意外发现 nil”。我怎样才能解决这个问题 ?谢谢
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2014-07-10
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
相关资源
最近更新 更多