3

50 項目を表示する UITableViewController があります。これは単純なテーブル ビューで、value1 セル タイプを使用しています。行をタップすると、そのセルに UITextField が追加されます (デバッグ用に鮮やかな緑色の背景があります)。この時点では、ファーストレスポンダーにはしていません。ここで、テーブル ビューをスクロールすると、すべて正常です。予想どおり、明るい緑色のテキスト フィールドを持つセルはキューから取り出されて再利用され、他のセルにランダムに表示されます。

そのテキスト フィールドをファーストレスポンダーにすると、2 つの興味深いことが起こります。

  1. 一日中スクロールできますが、そのセルはキューから取り出されて再利用されることはありません。
  2. tableView:cellForRowAtIndexPath: は、最初の応答者であるテキスト フィールドを持つセルに対して呼び出されることはありません。

セルがプールから引き出されるようなものです。そして、テキスト フィールドがファーストレスポンダーではなくなるとすぐに、通常の状態に戻ります。

関連するコードは次のとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"indexPath= %@", indexPath);
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text =[NSString stringWithFormat:@"Label %@", self.items[indexPath.row]];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    [cell addSubview:self.textFieldForEditing];
    //[self.textFieldForEditing becomeFirstResponder];
}

そして、テキスト フィールドをファーストレスポンダにする方法は問題ではありません。didSelectRowAtIndexPath: の行のコメントを外すか、テキスト フィールドをタップします。いずれにせよ、同じ振る舞いです。

ある観点から、この動作は便利です。テキスト フィールドが表示されるべきでない場所に表示されるのを防ぐために、デキュー管理コードを実装する必要がなくなります。

しかし、この動作はどこにも文書化されていません。これは正常ですか?

4

0 に答える 0