在 iOS 6 中,-[UITextField bebe FirstResponder] 在 -viewWillAppear中不起作用:



在iOS 5.1和iOS 5.0中,它可以工作,但在iOS 6.0中,键盘不显示。

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}

现在,我将逻辑移到了-viewDidAppear:

// This works but is not desirable.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}

这是可行的,但并不可取。加载视图后将显示键盘向上滑动动画。

我希望当向左滑动的动画显示导航控制器中加载的视图时,键盘出现。

有人知道如何在iOS 6中显示视图时加载键盘吗?

更新

根据@Duck的反馈,我做了更多的测试。这似乎是UITableViewCells中包含的UITextFields特有的。

有人有什么建议吗?

第一个解决方案

所以一个完整的描述。这是一个包含两个静态单元格(电子邮件和密码)的表视图。在分配了表页脚视图的视图中有一个登录按钮。这两个单元格中有一个文本字段,属于自定义类型SICOTextFieldCell。

我的解决方案是在登录按钮后面(在表页脚视图中)放置一个伪文本字段。

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.SICO_fakeTextField;
[textField becomeFirstResponder];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.SICO_emailAddressTextField;
[textField becomeFirstResponder];
}

新解决方案

根据@stm的回答,我想出了一个新的(卓越的?)解决方案。

我的解决方案是呼叫-selectRowAtIndexPath:animated:scrollPosition:-[SICOTextFieldCell setSelected:animated:]是一个自定义的表视图单元格,它调用[self.textField becomeFirstResponder],从而神奇地正确绘制键盘。这仍然是一个黑客,但它是一个更干净的黑客。

@interface SICOLogInViewController ()
@property (readonly, nonatomic) UITextField *SICO_emailAddressTextField;
@property (readonly, nonatomic) UITextField *SICO_passwordTextField;
@end
@implementation SICOLogInViewController
- (IBAction)logIn
{
// Controller Details
}
#pragma mark Private
- (UITextField *)SICO_textFieldForRowAtIndexPath:(NSIndexPath *)indexPath
{
SICOTextFieldCell *cell = (SICOTextFieldCell *)[self.tableView cellForRowAtIndexPath:indexPath];
return cell.textField;
}
#pragma mark View lifecycle
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
animated:NO scrollPosition:UITableViewScrollPositionTop];
}
#pragma mark UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
switch (textField.returnKeyType) {
case UIReturnKeyGo:   [self logIn];                                       break;
case UIReturnKeyNext: [self.SICO_passwordTextField becomeFirstResponder]; break;
default: break;
}
return YES;
}
#pragma mark Properties
- (UITextField *)SICO_emailAddressTextField
{
return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
}
- (UITextField *)SICO_passwordTextField
{
return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
}
@end

创建单元格后,尝试在cellForRowAtIndexPath方法中调用它,或者在包含该textField的tableViewCell的viewWillAppear中调用它。

如果这给了你同样的结果,并且你仍然希望键盘以前出现,我会在开始时使用"假"textField来显示键盘。我的猜测是,在视图WillAppear之前,您的textField尚未添加。

我准确地尝试了您的代码,iOS6&在视图WillAppear中,它似乎运行良好。当你推到另一个视图时,你试图让键盘已经显示出来,我是对的吗?

我目前正在编写自己的输入表单工具包,并为此问题挣扎了几个小时。在发现我的编码很好后,我发现这个问题指向iOS6中可能存在的故障,并为此制定了解决方案。

如果你有(或创建)一个自定义的UITableViewCell,一个简单的解决方案是只子类-(void)layoutSubviews;并检查单元格的UITextField是否应该是第一个响应者(即,通过检查文本字段是否与委托中设置的焦点字段相同)。如果是,只需调用-(BOOL)成为第一响应程序;在UITextField上(再次)。

这绝对是一个比创建一个"假的"UITextField更好的解决方案;)

-viewWillAppear可能未在iOS6中调用?您是否尝试将代码放入- (void)viewWillLayoutSubviews

相关内容

  • 没有找到相关文章

最新更新