Jef*_*mas 17 uitextfield viewwillappear becomefirstresponder ios ios6
在iOS 5.1和iOS 5.0中它可以工作,但在iOS 6.0中键盘不显示.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
现在我把逻辑移到了-viewDidAppear:.
// This works but is not desirable.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
这有效,但不可取.在加载视图后显示键盘上滑动画.
我希望键盘能够出现,因为从左到右的动画显示了导航控制器中加载的视图.
有人知道如何在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];
}
Run Code Online (Sandbox Code Playgroud)
新解决方案
基于@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
Run Code Online (Sandbox Code Playgroud)
尝试在创建单元格后在cellForRowAtIndexPath方法中调用它,或者在包含该textField的tableViewCell的viewWillAppear中调用它.
如果这给你相同的结果,你仍然希望键盘出现之前,我会使用"假"textField在开头显示键盘.我的猜测是你的textField还没有在viewWillAppear之前添加.
| 归档时间: |
|
| 查看次数: |
7004 次 |
| 最近记录: |