17

在 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]它神奇地正确绘制键盘。它仍然是一个 hack,但它是一个更清洁的 hack。

@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
4

4 回答 4

5

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

如果这给您相同的结果并且您仍然希望键盘出现在之前,我会使用“假”文本字段在开头显示键盘。我的猜测是在 viewWillAppear 之前没有添加您的 textField。

于 2012-12-06T20:30:17.777 回答
2

我在 viewWillAppear 中完全尝试了您的代码,iOS6 和它似乎工作正常。当您推到不同的视图时,您试图让键盘已经显示,对吗?

于 2012-11-25T12:06:01.463 回答
2

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

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

这绝对是比创建“假” UITextField 更好的解决方案;)

于 2013-01-02T10:24:01.313 回答
-4

-viewWillAppear 可能不会在 iOS6 中调用?你试过把你的代码放进去- (void)viewWillLayoutSubviews吗?

于 2012-12-11T07:38:09.943 回答