アプリの UITextFields に標準の「次へ」機能を実装しました (次へを押すと、次の適切なテキスト フィールドに移動します)。ほとんどの場合、これはうまく機能し、適切なテキスト フィールドに問題なく移動します。ただし、なんらかの理由で、最初の応答者になるように要求すると、textField が NO を返すことがあり、その理由がわかりません。
テキストフィールド/ビューに関する情報:
ビューには複数の UITableViews があり、これらの UITableViewCells の一部には、ファーストレスポンダーになりたい UITextfields がありますが、そうでないものもあります。テーブルが作成されたら、メイン ビューのサブビューをループしてすべてのファーストレスポンダーを検索し、それらをファーストレスポンダーの配列 (_firstResponders - 変数名) に追加します。次のレスポンダーが必要な場合、各セルはデリゲートを介してメイン ビューにコールバックします。
以下は、次のレスポンダーを取得するために使用するコードです。
//get the current first responders index
NSInteger currentIndex = [_firstResponders indexOfObject:currentResponder];
// if the current index plus 1 is less than the overall count of first responders on this view then continue, else resign the responder as no more are avilable
if((currentIndex+1) < [_firstResponders count])
{
// get the potential next responder
UIResponder *nextResponder = [_firstResponders objectAtIndex:currentIndex+1];
// if it can become the first responder assign it,
// else callback into this function with the unavilable first responder
if([nextResponder canBecomeFirstResponder])
{
[currentResponder resignFirstResponder];
BOOL becomeFirstResponder = [nextResponder becomeFirstResponder];
if(becomeFirstResponder == NO)
{
DLog(@"TextField at index: %d has returned no to becoming first responder", (currentIndex+1));
}
}
else
[self getNextResponder:nextResponder];
}
else
[currentResponder resignFirstResponder];
}
ご覧のとおり、コードで最初のレスポンダーになることができることを確認し、テキストフィールドが手動で有効になっていることも確認しました (これは、レスポンダーをレスポンダーの配列に追加するときにも確認します)。また、これが発生したときに配列サイズとレスポンダーが設定されていることを確認し、それらが正しい/有効であることも言及する価値があります。
これについて私にとって最も奇妙な部分は、新しいレスポンダーを設定する前に現在のレスポンダーで rejectFirstResponder を呼び出さなかった場合にのみ、これを以前に見たことがあるということです。
NOを返す理由を知っている人はいますか/これを修正するにはどうすればよいですか?
前もって感謝します!