当前位置: 首页 > 面试题库 >

UITextField文本跳转iOS 9

满元凯
2023-03-14
问题内容

简要地说:我有ViewController两个UITextField要素。当loginField为firstResponder时,之后

self.passwordField.becomeFirstResponder()

登录字段中的文本跳到左上角并返回。更奇怪的是:此故障仅在第一时间重现,然后您需要重新创建ViewController以观察此行为

这是故障的视频http://tinypic.com/player.php?v=6nsemw%3E&s=8#.VgVb3cuqpHx

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField === self.loginField {
        self.loginField.resignFirstResponder()
        // Shitty workaround. Hi, Apple!
        self.loginField.setNeedsLayout()
        self.loginField.layoutIfNeeded()

        self.passwordField.becomeFirstResponder()
        return false
    }

    return true
}

有没有人被这个错误困扰?有什么建议?

键盘通知处理程序

我的主视图是UIScrollView,为此我将底部空间更改为超级视图,因此即使显示键盘,用户也可以滚动所有内容

func keyboardWillShow(notification : NSNotification) {
    let keyboardInfo = notification.userInfo!
    let keyboardFrame = keyboardInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue
    let animDuration = keyboardInfo[UIKeyboardAnimationDurationUserInfoKey]!.doubleValue!

    UIView.animateWithDuration(animDuration, animations: {
        self.scrollViewBottom.constant = keyboardFrame.height
        self.view.layoutIfNeeded()

        let offsetY = CGRectGetMaxY(self.loginButton.frame) + 10 - self.scrollView.frame.height
        if offsetY > 0 {
            self.scrollView.contentOffset = CGPointMake(0, offsetY)
        }
    })
}

func keyboardWillHide(notification : NSNotification) {
    self.scrollViewBottom.constant = 0
    self.view.layoutIfNeeded()
}

当我在iOS7中发现键盘通知时,8和9会有很大的不同。因此,在iOS
9中,即使键盘不会显示/隐藏,在更改firstResponder时也会发送通知。另外,当我通过点击textField来更改firstResponder时(而不是在我的代码处理的键盘上点击Next),则只有KeyboardWillShow通知,而没有KeyboardWillHide。对于我来说,userInfo有一些垃圾帧值,这是使用next按钮更改第一响应者时的日志(工作正常,没有故障):

2015-10-07 12:54:13.870
keyboardWillHide:[UIKeyboardFrameBeginUserInfoKey:NSRect:{{0,352},{320,216}},UIKeyboardCenterBeginUserInfoKey:NSPoint:{160,460},UIKeyboardFrameEndUserInfoKey:NSRect:{{0,568
},{320、216}},UIKeyboardCenterEndUserInfoKey:NSPoint:{160、676},UIKeyboardAnimationDurationUserInfoKey:0.25,UIKeyboardIsLocalUserInfoKey:1,UIKeyboardBoundsUserInfoKey:NSRect:{{0,0},{320,216}},UIKeyboardAnimationCurveUserInfoKey
7] -10-07 12:54:13.896
keyboardWillShow:[UIKeyboardFrameBeginUserInfoKey:NSRect:{{0,352},{320,216}},UIKeyboardCenterBeginUserInfoKey:NSPoint:{160,460},UIKeyboardFrameEndUserInfoKey:NSRect:{{0,352}
,{320、216}},UIKeyboardCenterEndUserInfoKey:NSPoint:{160、460},UIKeyboardAnimationDurationUserInfoKey:0.25,UIKeyboardIsLocalUserInfoKey:1,UIKeyboardBoundsUserInfoKey:NSRect:{{0,0},{320,216}},UIKeyboardAnimationCurveUserInfoKey:7]

这是我点击第二个textField时的日志:

2015-10-07 12:55:13.879
keyboardWillShow:[UIKeyboardFrameBeginUserInfoKey:NSRect:{{0,352},{320,216}},UIKeyboardCenterBeginUserInfoKey:NSPoint:{160,460},UIKeyboardFrameEndUserInfoKey:NSRect:{{0,352
},{320、216}},UIKeyboardCenterEndUserInfoKey:NSPoint:{
160、460
},UIKeyboardAnimationDurationUserInfoKey:0.25,UIKeyboardIsLocalUserInfoKey:1,UIKeyboardBoundsUserInfoKey:NSRect:{{0,0},{320,216}},UIKeyboardAnimationCurveUserInfoKey:7

解析

我发现我还有另一个键盘控制器,可以接收键盘通知并制作一些动画。那就是问题所在


问题答案:

根据您编辑的问题,当您点击键盘上的下一个按钮时,我会看到以下内容:

  1. 您先打电话resignFirstResponder(),然后becomeFirstResponder()。这将调用keyboardWillHide通知,然后keyboardWillShow通知
  2. 在其中keyboardWillHideself.view.layoutIfNeeded()没有动画的视图(和子视图-文本字段)布局。

因此,文本字段的布局是“固定的”,并且当您在keyboardWillShow文本字段中的文本中进行动画处理时,它不再“跳转”了,因为您在中进行了布局keyboardWillHide

但是,当您仅点击另一个文本字段时,仅会keyboardWillShow被调用,布局不会在文本字段中“固定”,并且在为视图设置动画时,文本会产生“跳转”动画。

这就是为什么当您单击键盘上的“下一步”时,它不会跳转,而当您单击另一个文本字段时,它会跳转。

所以我建议将其更改为:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField === self.loginField {
        self.passwordField.becomeFirstResponder()
        return false
    }

    return true
}

func keyboardWillShow(notification : NSNotification) {
    let keyboardInfo = notification.userInfo!
    let keyboardFrame = keyboardInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue
    let animDuration = keyboardInfo[UIKeyboardAnimationDurationUserInfoKey]!.doubleValue!

    self.loginField.layoutIfNeeded()
    self.passwordField.layoutIfNeeded()

    if keyboardFrame.height != self.scrollViewBottom.constant {
        UIView.animateWithDuration(animDuration, animations: {
            self.scrollViewBottom.constant = keyboardFrame.height
            self.view.layoutIfNeeded()

            let offsetY = CGRectGetMaxY(self.loginButton.frame) + 10 - self.scrollView.frame.height
            if offsetY > 0 {
                self.scrollView.contentOffset = CGPointMake(0, offsetY)
            }
        })
    }
}


 类似资料:
  • 问题内容: 如何检测textField中的任何文本更改?委托方法适用于某些东西,但不能完全满足我的需要。因为直到返回YES,否则textField文本不可用于其他观察者方法。 例如在我的代码中没有得到更新的文本,用户已经输入了。 他们获得Java事件处理程序之类的方法是什么。 问题答案: 从正确的方式做uitextfield文本更改回调: 我捕获了发送到UITextField控件的字符,如下所示:

  • 本文向大家介绍JavaScript实现自动跳转文本功能,包括了JavaScript实现自动跳转文本功能的使用技巧和注意事项,需要的朋友参考一下 贴一段自动跳转文本的代码实现: 实现代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • navigateToMiniProgram 基础库1.3.9开始支持,iOS版本2.1.23,Android版本2.1.38 navigateToMiniProgram(Object object) 打开另一个小程序 参数 Object object 属性 类型 默认值 必填 说明 appId string 是 要打开的小程序 appId path string 否 打开的页面路径,如果为空则打开

  • 问题内容: 以下代码是否有替代方法: 如果我正在处理一个巨大的文本文件,其行数未知但长度不同,并且需要跳转到特定行我事先知道哪个号码?当我知道我至少可以忽略文件的前半部分时,我很难一一处理它们。寻找更优雅的解决方案(如果有)。 问题答案: 行缓存: 该模块允许人们从Python源文件中获取任何行,同时尝试使用缓存在内部进行优化,这是从单个文件读取许多行的常见情况。模块使用它来检索源行以包含在格式化

  • 我在flutter上开发一个应用程序,在主屏幕上我有一个按钮,打开另一个屏幕,这是在一个方法。在那个屏幕上,我想做一些计算,比如接受用户输入和更新文本字段,在单击按钮时,方法calculateAmount被称为更新变量total,它反映在文本字段上,但文本字段没有更新,它只在按键盘上完成时更新...如何才能完成这个任务。下面是我的代码:

  • UITextField-Shake 是 UITextField 类添加了一个震动的动画,就像 OSX 登录界面的密码字段。