swift - 查看在特定文本字段委托(delegate)中向上移动

标签 swift uitextfield

我必须使用标记将 Swift 3.0 中最后一个 UITextField 中的 UIView 移动到下面提到的委托(delegate)方法上,

func textFieldDidBeginEditing(_ textField: UITextField) {
    if (textField.tag == 4){
        //UIView Up
    }
}

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
    if (textField.tag == 4){
        //UIView Down 
    }
    return true
}

我尝试了很多代码,但没有一个像通知等那样工作。

最佳答案

您需要将Observers添加到NotificationCenter中,以便在键盘向上向上向下时监听(我假设您的 textfield 导出是 lastTextField 以使此示例正常工作,但这显然必须适应您为其提供的任何名称)

IBOutlet weak var passwordTextField: UITextField!

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: .UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: .UIKeyboardWillHide, object: nil)

(上面的代码可以添加在viewDidLoad()中)

然后添加在这些通知到达时要执行的方法,如下所示:

func keyboardWillShow(_ notification:Notification) {
    if view.frame.origin.y >= 0 && lastTextField.isFirstResponder {
        view.frame.origin.y -= getKeyboardHeight(notification)
    }
}

func keyboardWillHide(_ notification:Notification) {
    if view.frame.origin.y < 0 {
        view.frame.origin.y += getKeyboardHeight(notification)
    }
}

这些方法中的验证可以防止双重执行,例如在文本字段之间移动时向上/向下移动两次,而无需放弃第一响应者,这在像您这样的情况下很常见(我假设您这样做是为了一个表单,因此需要澄清您只需要第四个文本字段)。请注意,我仅在 keyboardWillShow 方法中对指定的文本字段(及其导出 lastTextField)进行验证,以防您在显示键盘时移动另一个文本字段并退出响应者,在这种情况下,即使它不是您开始的原始位置,当键盘隐藏时, View 也会返回到其原始位置。

您还需要一种获取键盘高度的方法,这个可以帮助您:

func getKeyboardHeight(_ notification:Notification) -> CGFloat {
    let userInfo = notification.userInfo
    let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue // of CGRect
    return keyboardSize.cgRectValue.height
}

让我知道进展如何,但我刚刚在我的应用程序上测试了相同的代码,它可以工作,所以你应该没问题。

PS:请密切注意 Storyboard(如果您正在使用它)以及文本字段委托(delegate)是否已正确设置。

关于swift - 查看在特定文本字段委托(delegate)中向上移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45595172/

相关文章:

ios - 将核心数据数据库从一个应用程序迁移到另一个应用程序

ios - 无法更改 iOS 代码中的 CollectionView 单元格大小

ios - 设置导航栏标题

ios - 即使在运行 pod clean 命令后也无法删除 .xcworkspace

ios - 如何在应用加载时选择文本?

uitextfield - 使用 VoiceOver 将 UITextField 读取为数字

text - UITextField - 多行

ios - 具有相同 XIB 单元格和按钮的多个 Collection View

ios - 将输入到 UITextField 中的内容转换为计数器编号,例如 00 :01

objective-c - 带有 UITextField 的 UIPicker