50 項目を表示する UITableViewController があります。これは単純なテーブル ビューで、value1 セル タイプを使用しています。行をタップすると、そのセルに UITextField が追加されます (デバッグ用に鮮やかな緑色の背景があります)。この時点では、ファーストレスポンダーにはしていません。ここで、テーブル ビューをスクロールすると、すべて正常です。予想どおり、明るい緑色のテキスト フィールドを持つセルはキューから取り出されて再利用され、他のセルにランダムに表示されます。
そのテキスト フィールドをファーストレスポンダーにすると、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: の行のコメントを外すか、テキスト フィールドをタップします。いずれにせよ、同じ振る舞いです。
ある観点から、この動作は便利です。テキスト フィールドが表示されるべきでない場所に表示されるのを防ぐために、デキュー管理コードを実装する必要がなくなります。
しかし、この動作はどこにも文書化されていません。これは正常ですか?