在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中包含的UITextField。
有人有任何建议吗?
第一个解决方案
如此完整的描述。这是一个带有两个静态单元格(电子邮件和密码)的表格视图。视图中有一个分配了页脚视图的登录按钮。这两个单元格中包含一个文本字段,并且是自定义类型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
答案 0 :(得分:5)
尝试在创建单元格后在cellForRowAtIndexPath方法中调用它,或者在包含该textField的tableViewCell的viewWillAppear中调用它。
如果它给你相同的结果并且你仍然希望键盘出现在之前,我会使用“假”textField来开始显示键盘。我的猜测是你的textField还没有在viewWillAppear之前添加。
答案 1 :(得分:2)
我完全尝试了你的代码,iOS6&在viewWillAppear中它似乎工作正常。 当你翻到不同的视图时,你试图让键盘显示我是否正确?
答案 2 :(得分:2)
我目前正在编写自己的输入表格套件,并且在这个问题上花费了几个小时。 在发现我的编码很好之后,我发现这个问题指出了iOS 6中可能存在的故障,并为此制定了解决方案。
如果你有(或创建)自定义UITableViewCell,一个简单的解决方案就是子类 - (void)layoutSubviews;并检查单元格的UITextField是否应该是第一个响应者(即通过检查文本字段是否与您的委托中设置的焦点字段相同)。 如果是这样,只需调用 - (BOOL)成为FirstResponder;在您的UITextField上(再次)。
这绝对是比创建“虚假”UITextField更好的解决方案;)
答案 3 :(得分:-4)
-viewWillAppear可能在iOS6中没有被调用?您是否尝试将代码放入- (void)viewWillLayoutSubviews
?