我在UIView上有多个文本字段。
我在textFieldShouldBeginEditing方法中退出前一个textField,执行以下事件序列
收到UIKeyboardWillHideNotification,对应于隐藏前一个字段的键盘的字段。
方法textFieldShouldBeginEditing返回YES然后
收到UIKeyboardWillShowNotification,显示当前字段的键盘。
但是,在OS 3.2中,即使textFieldShouldBeginEditing返回YES,也不会收到当前字段的UIKeyboardWillShowNotification。
逻辑适用于OS< 3.2
我可能做错了什么想法?
在我的代码的一部分下面列出(在xib中只有两个文本字段)。
我需要在keyboardWillShow和keyboardWillHide上执行一组操作。查看运行OS 3.2和OS中的代码的差异< 3.2
有人可以解释行为上的差异吗?
@interface ExampleViewController : UIViewController
{
IBOutlet UITextField *numericTextField;
IBOutlet UITextField *alphaTextField;
UITextField *lastTextField;
int lastCursorPos;
int cursorPosition;
NSMutableArray *textFields;
}
@property (nonatomic, retain) UITextField *lastTextField;
@property (nonatomic, retain) NSMutableArray *textFields;
@end
- (void)viewWillAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification object:self.view.window];
self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
self.textFields = [[NSMutableArray alloc] initWithCapacity:2];
[self.textFields insertObject:alphaTextField atIndex:0];
[self.textFields insertObject:numericTextField atIndex:1];
cursorPosition = 1;
[numericTextField becomeFirstResponder];
}
-(void)viewWillDisappear:(BOOL)animated
{
[self setEditing:NO animated:YES];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
int index;
for(UITextField *aField in self.textFields){
if (textField == aField){
index = [self.textFields indexOfObject:aField];
}
}
if(index>=0 ){
lastCursorPos = cursorPosition;
self.lastTextField = [self.textFields objectAtIndex:lastCursorPos-1];
cursorPosition = index +1;
}
[self.lastTextField resignFirstResponder];
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
- (void)keyboardWillShow:(NSNotification *)notif {
NSLog(@"Inside keyboardWillShow");
}
- (void)keyboardWillHide:(NSNotification *)notif {
NSLog(@"Inside keyboardWillHide");
}
答案 0 :(得分:3)
我相信,从iOS 3.2开始,在两个文本字段之间切换时,不再触发UIKeyboardWillHideNotification和UIKeyboardWillShowNotification。基本上,只有键盘实际显示或隐藏时才会触发通知,并且由于从一个文本字段切换到另一个文本字段不会隐藏键盘,因此事件不会触发。
在iOS 3.2之前,无论何时更改字段,都会触发事件。新的方式可以说是更正确的,但它确实使你想要做的更具挑战性。
您可能最好为文本字段实现委托,然后您可以检查shouldBeginEditing / didEndEditing事件,或者,您可以继承UITextField并覆盖becomeFirstResponder / resignFirstResponder方法,以便您可以挂钩并实现当字段收到并失去焦点时你的逻辑。
答案 1 :(得分:1)
我认为您在特定文本字段时尝试更改键盘类型。而不是像你简单地使用这两种方法那样追踪它,
- (void)textFieldDidBeginEditing:(UITextField *)textField;
- (BOOL)textFieldShouldReturn:(UITextField *)textField;
每当您触摸文本字段进行编辑时,都会调用第一个方法。 在这里你可以写出键盘更改代码
EG: If textfield is of type 1
set Keyboard Type to alphanumeric.
Else if textfield is of type 2
set Keyboard Type to numeric only.
然后,只要按屏幕键盘上的RETURN键,就会调用第二种方法。 在这里,您可以为任何传入的文本字段控件编写[textfield resignFirstResponder]语句。
希望这有助于.. :)干杯!
答案 2 :(得分:1)
出现键盘时,notificationCenter会调用该方法。 如果它不起作用,则将对象设置为nil。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification object:self.view.window];