关于iphone:textFieldDidEndEditing在不需要时移动屏幕

textFieldDidEndEditing moves the screen when not wanted

在我的应用程序中,我的uitextfields位于键盘顶部的下方,因此我必须向上移动视图,以便在编辑时,文本字段在键盘上可见。为此,我使用了uitextfieldDelegate方法,textfieldDidbeginediting:。然后在方法textfieldDindediting:中,我将视图下移。

当我尝试在文本字段之间切换时,会出现问题。当我这样做时,委托调用方法textfieldDindediting:然后立即调用textfieldDibegineding:对于另一个文本字段,它使视图向下,然后立即向上,因此看起来像是屏幕震动。有没有解决这个问题的办法?


我刚刚遇到了同样的问题,这就是我找到的解决方案。

设置一个单独的方法,以便在退出textfield键盘时进行处理,并将self.view.center重新对齐放置在其中。这样,可以确保textfieldDindediting方法保持独立。

如果我没有正确地解释自己,这里有一个例子。请注意,当用户点击文本字段时,我会在导航栏中放置一个完成按钮(因为它是一个数字键盘),尽管您可以将此方法链接到普通键盘上的完成按钮:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (void)textFieldDidBeginEditing:(UITextField *)textField {
    UIBarButtonItem *hideKeyboardButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(resignResponder:)];
    [self.navigationItem setRightBarButtonItem:hideKeyboardButton animated:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {

//Nothing needs to go here anymore

}

- (void)resignResponder:(id)sender {
    [textField resignFirstResponder];
    //Use core animation instead of the simple action below in order to reduce 'snapback'
    self.view.center = CGRectMake(0, 0, 320, 480);
}


我用另一种方法来解决这个问题:当从一个编辑控件切换到另一个编辑控件(field1->field2)时,您将收到以下消息:

  • 文本字段应注册(字段2)
  • 文本字段应拒绝专用(字段1)
  • 文本字段结束编辑(字段1)
  • 文本字段didbeginediting(字段2)

我要做的是使用一个计数器变量(x):

  • 在textfieldShouldBeginediting中添加x+=1
  • 在textfieldShouldenDedicing中添加x-=1

然后:

  • 在textfieldDindediting中,如果x<0,则将控件拉伸到原始位置。
  • 在textfieldDidbeginediting中,如果x>0,则向上滚动控件


我认为移动textfield的最佳方法是注册通知

1
2
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

在键盘中修改textfield帧是否显示:&keyboardwillhide:


只需签入您所处的文本字段(例如,为它们提供tags)。然后根据这些信息,移动或不移动视图。