【问题标题】:dismissing the keyboard on UIAlertController UITextField关闭 UIAlertController UITextField 上的键盘
【发布时间】:2017-10-28 15:52:32
【问题描述】:

通常view.endEditing(true) 在 iOS 上总是快速移除键盘。

但这并不总是正确的,例如当UITextFieldself.present()'ed 模态view 的一部分时,即UIAlertController 内的表单

例子

    let alert = UIAlertController(title: _title, message: "Choose", preferredStyle: .alert)

    let numberLabel = UILabel(frame: CGRect(x:10, y:0, width:90, height:20))
    numberLabel.textColor = .black
    numberLabel.textAlignment = NSTextAlignment.left
    numberLabel.font = UIFont(name: titleLabel.font.fontName, size: 16)
    numberLabel.font = UIFont.boldSystemFont(ofSize: titleLabel.font.pointSize)
    numberLabel.text = "Quantity"

    let quantityField = UITextField(frame: CGRect(x:100, y:0, width:140, height:25))
    quantityField.layer.borderWidth = 1
    quantityField.keyboardType = .numberPad
    quantityField.layer.borderColor = UIColor.lightGray.cgColor
    quantityField.delegate = self
    self.addDoneButtonOnKeyboard(textField: quantityField)
    self.present(alert, animated: true, completion: nil)

现在在这个self.addDoneButtonOnKeyboard 方法中我有这个漂亮的代码

func addDoneButtonOnKeyboard(textField: UITextField){
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x:0, y:0, width:320, height:50))
    doneToolbar.barStyle = UIBarStyle.default

    let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
    let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(ViewControllerDisplay.doneButtonAction(_:)))

    let items = NSMutableArray()
    items.add(flexSpace)
    items.add(done)

    doneToolbar.items = items as? [UIBarButtonItem]
    doneToolbar.sizeToFit()

    textField.inputAccessoryView = doneToolbar
}

@objc func doneButtonAction(_ btn: UIBarButtonItem){
    view.endEditing(true)
}

所有这些的目的是为了显示“完成”键盘按钮。确实如此。事实上它看起来很棒,我也可以捕获 doneButtonAction() 事件,这很棒,但我只捕获 UIBarButtonItem 所以我不能使用 UITextField.resignFirstResponder() 方法,即使我知道它会起作用。我必须使用“视图”

我想做的是调用alert.endEditting(true),但我尝试循环浏览子视图,筛选UIAlertController 的任何出现,但self.present 不起作用

谁能帮我从警报视图中清除这个键盘?

【问题讨论】:

    标签: swift uitextfield uialertcontroller


    【解决方案1】:

    我通过获取 topMost 视图控制器并调用 endEditing(true) 来修复它

    @objc func doneButtonAction(_ btn: UIBarButtonItem){
        if var topController = UIApplication.shared.keyWindow?.rootViewController {
            while let presentedViewController = topController.presentedViewController {
                topController = presentedViewController
            }
            topController.view.endEditing(true)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 2017-03-28
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2016-06-30
      • 2014-02-12
      相关资源
      最近更新 更多