2

このボード上の人々の素晴らしい助けにより、私は生徒のためのアプリをほぼ完成させました! 前と次のボタンがあるキーボードの上にツールバーを表示することができました。次に、ボタンを 3 つの入力フィールドの間に配置しました。

ユーザーが最初のフィールドから開始すると、前/次のボタンを使用した場合と同じように、すべてのフィールド間を行き来できます。ただし、ユーザーがテキスト フィールド 3 を使用しているときに最初のフィールドをクリックすると、ボタンはそのまま残り、正しく機能しません。

-(void)keyboardWillShow:(id)sender{
    if ([inputA isFirstResponder]) {
        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    } else if ([inputB isFirstResponder]) {
        [nextButton setEnabled:YES];
        [previousButton setEnabled:YES];
    } else if ([inputC isFirstResponder]) {
        [nextButton setEnabled:NO];
        [previousButton setEnabled:YES];
    }
}

... 次のテキスト フィールドを循環します

-(void)nextField:(id)sender{
    if ([inputA isFirstResponder]) {
        [inputB becomeFirstResponder];
        [previousButton setEnabled:YES];
        [nextButton setEnabled:YES];
    } else if ([inputB isFirstResponder]) {
        [inputC becomeFirstResponder];
        [previousButton setEnabled:YES];
        [nextButton setEnabled:NO];
    } else if ([inputC isFirstResponder]) {
        [inputB becomeFirstResponder];
        [previousButton setEnabled:YES];
        [nextButton setEnabled:YES];
    }
}

... 前のテキスト フィールドを循環

-(void)previousField:(id)sender{
    if ([inputC isFirstResponder]) {
        [inputB becomeFirstResponder];
        [nextButton setEnabled:YES];
        [previousButton setEnabled:YES];
    } else if ([inputB isFirstResponder]) {
        [inputA becomeFirstResponder];
        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    } else if ([inputA isFirstResponder]) {
        [inputB becomeFirstResponder];
        [nextButton setEnabled:YES];
        [previousButton setEnabled:YES];
    }
}

私のキーボード コードでは、前のボタンは previousField を呼び出し、次のボタンは nextField を呼び出します。私は、keyboardWillShow を実行したときに、さまざまな入力をファーストレスポンダーとして設定していたと考えましたが、それは最初の実行時のみです。

ユーザーがフィールドをクリックするとファーストレスポンダーになるようにする方法はありますか?

4

2 に答える 2

1

更新のトリガーに関しては、 @mackworth によって提案されたように呼び出すために使用できるUITextFieldデリゲート メソッドがあります。同様のことを行うメソッドが他にもいくつかあります。詳細については、関連するデリゲート プロトコルを参照してください。-textFieldDidBeginEditing:-setPrevNextButtons

たとえば、テキスト フィールドのデリゲートで次の制御コードを試してください。

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    if (textField == inputA || textField == inputB || textField == inputC)
        [self setPrevNextButtons];
}

これを機能させるには、テキスト フィールドのデリゲートを設定する必要があることは言うまでもありません。

于 2012-05-01T22:44:46.740 に答える
0

私が提案できる2つのこと:最初に、DRYで実行してください:「同じことを繰り返さないでください」. 同じコードが何度も表示される場合は、メソッドに移動してください。次に、keyboardWillShow の呼び出し元を指定していません。EditingDidBegin時に各inputXによって呼び出されていることをペン先で確認してください。したがって、短いコードは次のようになります。

-(void) setPrevNextButtons {  //ensures that Prev/Next buttons are correct for current firstResponder
    if ([inputA isFirstResponder]) {
        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    } else if ([inputB isFirstResponder]) {
        [nextButton setEnabled:YES];
        [previousButton setEnabled:YES];
    } else if ([inputC isFirstResponder]) {
        [nextButton setEnabled:NO];
        [previousButton setEnabled:YES];
    }
}

-(void)keyboardWillShow:(id)sender{
    [self setPrevNextButtons];
}

//goes through the different text fields
-(void)nextField:(id)sender{

    if ([inputA isFirstResponder]) {
        [inputB becomeFirstResponder];
    }else if ([inputB isFirstResponder]) {
        [inputC becomeFirstResponder];
    }    
    [self setPrevNextButtons];
}

-(void)previousField:(id)sender{
    if ([inputC isFirstResponder]) {
        [inputB becomeFirstResponder];
    } else if ([inputB isFirstResponder]) {
        [inputA becomeFirstResponder];
    }
    [self setPrevNextButtons];

}

トリッキーだと感じた場合は、次のこともできます。

-(void) setPrevNextButtons {
    [previousButton setEnabled: [inputB isFirstResponder] || 
                                [inputC isFirstResponder]  ];
    [nextButton setEnabled: [inputA isFirstResponder] || 
                            [inputB isFirstResponder]  ];
}
于 2012-05-01T22:29:13.877 に答える