2012-05-01 9 views
2

このボードの人々の素晴らしい助けを借りて、私はほとんど私の学生のために私のアプリをやっている!前と次のボタンがあるキーボード上にツールバーを表示させることができました。私は3つの入力フィールドの間にボタンを移動させました。他のボタンを有効にしないUIButton

ユーザーが最初のフィールドで開始した場合、前の/次のボタンを使用した場合と同じように、すべてのフィールド間を行き来することができます。ただし、ユーザーがテキストフィールド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を実行したときに、最初の応答者としてさまざまな入力を設定していたと考えましたが、これは最初の実行時のみです。

ユーザーがフィールドをクリックして最初の応答者になるようにする方法はありますか?

答えて

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] ]; 
} 
+0

ありがとうございます。私はDRYステートメントが好きです!将来的にはそれについて間違いなく考えます。私は今夜​​コードを試して、それを機能させることができるかどうかを見ます。再度、感謝します! – Douglas

+0

それは働いた!しかし、私はこれで新しいので、別の質問があります。私のペン先について話すとき、私はそれについては分かりません。私はXcode 4.3を使用していますが、どこにでもペン先が表示されません。私はストーリーボード上にいるときに、editdidegeginの横にあるボタンをストーリーボードにドラッグすることができますが、キーボードに接続する方法はわかりません。アイデアありがとう! – Douglas

+0

申し訳ありませんが、NIBファイルはストーリーボードのコンセプトの前身です。私の提案を5.xの現代の世界に正しく翻訳しました!あなたはcontroldidegeginからviewControllerにコントロールをドラッグすると、SentEventに接続するオプションが表示されますkeyboardWillShow – mackworth

1

を更新をトリガするためとして、UITextFieldは、デリゲートメソッド-textFieldDidBeginEditing:、あなたは可能性があります@mackworthの提案通りに-setPrevNextButtonsに電話をかけてください。同様のことを行う他の方法がいくつかあります。詳細は related delegate protocolを参照してください。

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

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

は、それはあなたが動作するように、このためのテキストフィールドのデリゲートを設定する必要がありますということは言うまでもないです。

+0

Taldar、私はこれらの答えの両方にチェックを与えることができたらいいと思う。そして、私はまだ何もできません。しかしこれはあなたが言ったように更新を解決しました。本当にありがとう。 – Douglas

関連する問題