1

アプリの 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を返す理由を知っている人はいますか/これを修正するにはどうすればよいですか?

前もって感謝します!

4

0 に答える 0