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 に固有のようです。

誰か提案はありますか?

最初の解決策

だから完全な説明。これは、2 つの静的セル (電子メールとパスワード) を含むテーブル ビューです。テーブル フッター ビューが割り当てられたビューにログイン ボタンがあります。2 つのセルにはテキスト フィールドがあり、カスタム タイプの 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
4

4 に答える 4

5

セルを作成した後に cellForRowAtIndexPath メソッドで呼び出すか、その textField を含む tableViewCell の viewWillAppear で呼び出してみてください。

それでも同じ結果が得られ、キーボードを前に表示したい場合は、「偽の」textField を使用して最初にキーボードを表示します。私の推測では、viewWillAppear の前に textField が追加されていません。

于 2012-12-06T20:30:17.777 に答える
2

私は現在、独自の入力フォーム キットを作成しており、この問題で数時間苦労しました。私のコーディングが問題ないことがわかった後、この質問が iOS 6 の不具合の可能性を指摘しているのを見つけ、その解決策に取り組みました。

カスタム UITableViewCell を持っている (または作成する) 場合、簡単な解決策は単にサブクラス化することです - (void) layoutSubviews; セルの UITextField が最初のレスポンダーであるかどうかを確認します (つまり、テキスト フィールドがデリゲートで設定されたフォーカスされたフィールドと同じかどうかを確認します)。その場合は、 - (BOOL) becomeFirstResponder; を呼び出すだけです。あなたのUITextFieldで(再び)。

これは、「偽の」UITextFieldを作成するよりも間違いなく優れたソリューションです;)

于 2013-01-02T10:24:01.313 に答える
2

私はあなたのコードをiOS6とviewWillAppearで正確に試しましたが、うまくいくようでした。別のビューに移動したときにキーボードを既に表示しようとしているのは正しいですか?

于 2012-11-25T12:06:01.463 に答える
-4

-viewWillAppearはiOS6では呼び出されない可能性がありますか?コードを入れようとしました- (void)viewWillLayoutSubviewsか?

于 2012-12-11T07:38:09.943 に答える