ios - becomeFirstResponder 返回 true 并且键盘被关闭

标签 ios swift

在下面的代码中,我试图通过下一个按钮将控制权从 UITextField 转移到下一个。

我通过在下一个 UITextField 上调用 becomeFirstResponder 来完成此操作。

如果我没有在第一个和当前的 UITextField 中键入任何内容,下一个按钮将按预期工作。键盘保持向上,焦点转移。

如果我确实输入了一些东西,并且只有当字段为空时。调用下一个字段的方法 becomeFirstResponder 并返回 true,但键盘被关闭且焦点未转移。

public func numberPad(numberPad: APNumberPad, functionButtonAction:UIButton, textInput: UIResponder) {

    var current:UITextField?

    for field in editCells {

        if (current != nil) {

            field.valueTextField.becomeFirstResponder()

            return;
        }

        if (field.valueTextField == activeField) {
            current = field.valueTextField
        }

    }

    textInput.resignFirstResponder()


}

当按下键盘上的 NEXT 或 DONE 按钮时调用此函数。这是一个自定义数字键盘。特别是 APNumberPad。 https://github.com/podkovyrin/APNumberPad 这是我的委托(delegate)功能。

任何人都知道 becomeFirstResponder 会返回 true 而不起作用的任何原因,仅在某些情况下,但在其他情况下起作用?

是的,这是主 UI 线程。在当前字段上添加对 resignFirstResponder 的调用,然后延迟并调用 becomeFirstResponder 起作用。这会导致键盘闪烁,无论延迟有多小。

编辑……我现在正在做这件事……并且暂时忍受键盘闪烁: Delay是GCD的辅助函数

public func numberPad(numberPad: APNumberPad, functionButtonAction:UIButton, textInput: UIResponder) {

    var current:UITextField?

    for field in editCells {

        if (current != nil) {

            current?.resignFirstResponder()
            delay (0) {
                field.valueTextField.becomeFirstResponder()
            }

            return;
        }

        if (field.valueTextField == activeField) {
            current = field.valueTextField
        }

    }

    textInput.resignFirstResponder()


}

最佳答案

不知道对你有没有帮助。我写了一个简单的 UITextField 扩展,其中包含一个 returnView 变量,它决定文本字段在返回键按下时应该做什么:

  • 转到下一个文本字段(如果 returnView 是一个 UITextField)
  • 模拟按钮触摸(如果 returnView 是一个 UIButton)
  • 或隐藏键盘
class NextTextField: UITextField, UITextFieldDelegate {

    @IBOutlet weak var returnView: UIView? {
        didSet {
            if returnView is UITextField {
                returnKeyType = UIReturnKeyType.Next
            }
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        delegate = self
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {

        if let nextTextField = self.returnView as? UITextField {
            nextTextField.becomeFirstResponder()
        } else if let nextButton = self.returnView as? UIButton {
            nextButton.sendActionsForControlEvents(.TouchUpInside)
        } else {
            self.resignFirstResponder()
        }

        return true
    }

}

关于ios - becomeFirstResponder 返回 true 并且键盘被关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33356744/

相关文章:

ios - 可达性问题 iOS9

ios - 尝试快速遍历结构数组时出现奇怪的语法

ios - 无法分配给协议(protocol)中的属性 - Swift 编译器错误

ios - Flutter-Codemagic-IOS构建失败

swift - Swift 3 混合协议(protocol)、扩展和类继承的可能错误

ios - 从 Settings.app 保存密码

iOS Swift - 具有复杂数据关系的核心数据示例

swift - 默认转至 ViewController

swift - 如何访问我在 Storyboard 中设置的 wR x hR 模式中使用的高度

ios - Realm :为 Realm 文件设置 NSURLIsExcludedFromBackupKey