5

アプリのログイン画面を作成していますが、まだ入力されていないフィールドがある場合は[次へ]と表示し、すべてのフィールドが入力されている場合は[実行]と表示する必要があります( UITextFields)。

以下のコードは、正しいタイミングでNextとGoを表示するという点で正常に機能します。ただし、「次へ」から「実行」に変わると、キーボードの次のタップは無視されます。「Go」と表示され、バックスペースでテキストフィールドを空にすると、そのような問題は発生せず、Nextが表示されます。古いキーボードがまだそこにあり、タップすると消えてしまうようなものです。

私の質問は、この問題の原因は何ですか、そしてもっと重要なことに、キーボードのこのフリーズを取り除くにはどうすればよいですか?

UITextField *theSender = (UITextField *)sender;
if (allTextFieldsAreFilled) {
    if (theSender.returnKeyType!=UIReturnKeyGo) {
        theSender.returnKeyType = UIReturnKeyGo;
        [theSender resignFirstResponder];
        [theSender becomeFirstResponder];
    }
} else {
    if (theSender.returnKeyType!=UIReturnKeyNext) {
        theSender.returnKeyType = UIReturnKeyNext;
        [theSender resignFirstResponder];
        [theSender becomeFirstResponder];
    }
}

このコードは、3つのUITextFieldのいずれかの値が変更されるたびに呼び出されるため、EditingChangedイベントに接続されたIBActionです。

よろしくお願いします!

編集

これは、テキストフィールドがセキュア(パスワード)に設定されている場合にのみ発生することがわかりました。セキュアに設定されていない場合、フリーズせず、コードは完全に機能します。問題は、「安全な」テキストフィールドが最初の応答者である場合に、「実行」ボタンへの変更が一般的に発生することです。したがって、これによって問題が変わることはありません。

4

1 に答える 1

1

これをテストするために、新しいシングルビューアプリケーションプロジェクトを作成しました。次のコードをViewController.m

#import "ViewController.h"

@interface ViewController () <UITextFieldDelegate>
{
    @private
    IBOutlet UITextField* m_fieldA;
    IBOutlet UITextField* m_fieldB;
    IBOutlet UITextField* m_fieldC;
}

@end

@implementation ViewController

// connected to Editing Did Begin
- (IBAction) onFocus:(UITextField*)_textField
{
    [self updateKeyboardFor:_textField];
}

// connected to Editing Changed
- (IBAction) onChanged:(UITextField*)_textField
{
    [self updateKeyboardFor:_textField];
}

- (void) updateKeyboardFor:(UITextField*)_textField
{
    bool allTextFieldsAreFilled = [m_fieldA.text length] && [m_fieldB.text length] && [m_fieldC.text length];

    if (allTextFieldsAreFilled)
    {
        if (_textField.returnKeyType != UIReturnKeyGo)
        {
            _textField.returnKeyType = UIReturnKeyGo;
            //[_textField resignFirstResponder];
            //[_textField becomeFirstResponder];
            [_textField reloadInputViews];
        }
    }
    else
    {
        if (_textField.returnKeyType != UIReturnKeyNext)
        {
            _textField.returnKeyType = UIReturnKeyNext;
            //[_textField resignFirstResponder];
            //[_textField becomeFirstResponder];
            [_textField reloadInputViews];
        }
    }
}

// A part of UITextFieldDelegate
- (BOOL) textFieldShouldReturn:(UITextField*)_textField
{
    if (_textField.returnKeyType == UIReturnKeyGo)
    {
        [_textField resignFirstResponder];

        // go off and perform 'go'
    }
    else
    {
        if(_textField == m_fieldA) [m_fieldB becomeFirstResponder];
        if(_textField == m_fieldB) [m_fieldC becomeFirstResponder];
        if(_textField == m_fieldC) [m_fieldA becomeFirstResponder];
    }

    return true;
}

@end

次に、XIBで3つ作成し、UITextFieldsそれらをIBOutlets、、に接続し、このViewControllerをすべてのフィールドのIBActionsとして設定します。delegate

安全なフィールドに関係なく、すべてが正常に機能しているようです。

私の推測では、あなたの問題はあなたが「次へ」フィールドに移動するコードのどこかにあると思います。投稿したコードではありません。また、すべてのアウトレットとデリゲートが適切にリンクされていることを確認してください。


更新:上記のコードを編集しました。コメントアウトされた行が問題でしたreloadInputViews。ボタンを更新するために使用する必要があります。

キーボードをロックしていなかったようです。しかし、それが行っていたのは、最初の文字を入力し、ボタンを更新するために辞任/電話になり、2回押すと最初の文字が上書きされた後です。これはiOSのバグのようです...最初の文字の後にスペースを入力すると、より目立ちます。パスワードフィールドの内容で内容を更新するラベルを追加したことに気付いたとき、何が起こっているのかがさらに明確になりました。

于 2013-03-18T11:27:51.767 に答える