我有ViewController
个UITextField
元素:登录名和密码。我为这些字段设置了委托,其中包括以下代码:
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField === self.loginField {
self.loginField.resignFirstResponder()
self.passwordField.becomeFirstResponder()
return false
}
return true
}
当他按下键盘上的“下一步”按钮时,此逻辑应将用户从登录文本字段切换为密码。但我坚持不懈:在
之后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
}
答案 0 :(得分:50)
基于此处发布的其他一些想法,这是一个易于实施的解决方案,在所有情况下都适用(对我而言),并且看起来没有任何副作用:
- (void)textFieldDidEndEditing:(UITextField *)textField
{
// Workaround for the jumping text bug.
[textField resignFirstResponder];
[textField layoutIfNeeded];
}
如果您从-textFieldShouldReturn:
以编程方式进入下一个字段,或者用户只是触及另一个响应者,则此解决方案都可以使用。
答案 1 :(得分:16)
在<script type="text/javascript">
$(document).on('keyup', '.test', function() {
var x = $(this).val();
$(this).val(x.toString().replace(/,/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ","));
});
</script>
<form>
<input class="test" type="text" />
</form>
子类中,您可以执行以下操作:
UITextField
这里的诀窍是确保在调用 -(BOOL)resignFirstResponder
{
BOOL resigned = [super resignFirstResponder];
[self layoutIfNeeded];
return resigned;
}
后致电layoutIfNeeded
。
这样做是非常方便的,因为你不需要自己在委托回调中调用resignFirstResponder
,因为这会导致我在resignFirstResponder
内部出现问题,但上述情况并非如此。 t:)
答案 2 :(得分:8)
使用此代码可避免在UITextField中跳转文本。
attributes
答案 3 :(得分:5)
func textFieldDidEndEditing(_ textField: UITextField) {
textField.layoutIfNeeded()
}
答案 4 :(得分:5)
我也面临同样的问题。以下代码适用于我。
func textFieldDidEndEditing(_ textField: UITextField) {
textField.layoutIfNeeded()
}
答案 5 :(得分:1)
更多“通用”选项是在 UITextField 子类中使用通知:
- (void)setupJumpingTextWorkaround {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(forceLayout)
name:UITextFieldTextDidEndEditingNotification object:self];
}
- (void)forceLayout {
[self setNeedsLayout];
[self layoutIfNeeded];
}
不要忘记取消订阅
答案 6 :(得分:1)
根据我对this的理解:
当您在键盘的回调中处理布局更改或动画时,可能会导致此问题显示和隐藏通知(通常在您希望文本字段被推高以便键盘不会隐藏它的情况下)
解决方案: 我正在面对这个问题,因为我每次键盘显示时都会执行layoutIfNeeded,假设它是安全的,显然不是,所以当我只在需要更换帧时进行检查时,跳转停止了。 / p>
答案 7 :(得分:0)
我没有给我的文本字段代表。相反,我创建了一个IBAction并将其附加到&#34; Do End On Exit&#34;事件。这种方法也会出现故障,但仅限于iOS 9.它看起来是一个操作系统错误。
我的行动如下:
@IBAction func textFieldAction(sender: UITextField) {
if sender === usernameField {
passwordField.becomeFirstResponder()
}
}
如上所述,故障发生了,但是当我做下面的故障时,故障消失了:
@IBAction func textFieldAction(sender: UITextField) {
if sender === usernameField {
sender.resignFirstResponder()
passwordField.becomeFirstResponder()
}
}
我似乎不需要致电setNeedsLayout()
。