0

aUITextFieldを編集して return を押した後、ループして次のフィールドをチェックします。そのフィールドのインデックス パスを取得して保存します。次に、テーブル データをリロードし、テーブルが構築されているときに、が次のテキスト フィールドとindexPath等しい場合は、最初のレスポンダーとして設定します。indexPath

textField私は正しいものとすべてのものをつかみますがindexPath、ファーストレスポンダーは設定されていません。代わりに、フォーカスが消えるだけです。

私のコード:

//inside UITextFieldShouldReturn

for (int i = uiTextField.fieldTag + 1; i < group.fields.count; i++) {
ObjectEditField *field = [group.fields objectAtIndex:i];
     if (field.propName && field.updateObjectOnEdit == YES && [field isKindOfClass:[ObjectEditTextField class]]) {
        // set the active field
        activeField = field;

       // obtain a pointer to the textfield object and set it to be the first responder
         ObjectEditTextField *textField = (ObjectEditTextField *)field;
         if (![textField.field isFirstResponder]) {
         UITableViewCell *cell = (UITableViewCell *)[[[uiTextField superview] superview] superview];
         firstResponderIndexPath = [_fieldsTableView indexPathForCell:cell];

次に、テーブルビューでfirstResponderIndexPath呼び出しreloadDataを行うと、内部tableView:cellForRowAtIndexPath:には次のようになります。

if (firstResponderIndexPath.row + 1 == indexPath.row)
{
    ObjectEditTextField *textField = (ObjectEditTextField *)field;
    NSLog(@"display: %@", textField.field.text);
    [textField.field becomeFirstResponder];
}

の出力NSLogは正しく、フィールドは正しいはずです。ただし、ファーストレスポンダーが正しく設定されません。

4

2 に答える 2

1

ビューがウィンドウのビュー階層の一部である場合にのみ、ファーストレスポンダを設定できます。「tableView:cellForRowAtIndexPath:」は、追加される前に呼び出されます。したがって、セルが追加された後、たとえば UITableViewController サブクラスで reloadData を呼び出した後、ファーストレスポンダーを設定する必要があります。

[self.tableView reloadData];
MyTableCell *cell = (id)[self.tableView cellForRowAtIndexPath: firstResponderIndexPath];
[cell.myTextFieldProperty becomeFirstResponder];
于 2013-04-26T19:33:25.713 に答える
0

を呼び出している時点でセルがウィンドウに追加されましたbecomeFirstResponderか? そうでない場合は、何も起こりません。ドキュメントから:

なるFirstResponder

このメソッドを呼び出して、ビューなどのレスポンダー オブジェクトをファーストレスポンダーにすることができます。ただし、ビュー階層の一部である場合にのみ、そのビューで呼び出す必要があります。ビューの window プロパティが UIWindow オブジェクトを保持している場合、それはビュー階層にインストールされています。nil を返す場合、ビューは階層から切り離されます。

tableView:willDisplayCell:forRowAtIndexPath:代わりに呼び出してみてください。becomeFirstResponder目的のセルにブール型のプロパティを設定し、 のフィールドで呼び出すこともできますdidMoveToSuperview

于 2013-04-26T19:33:38.153 に答える