UITableView クラスの奇妙なバグに遭遇したと思います。テーブルのセルに UItextView (私の場合は編集不可でスクロール不可) が含まれており、ユーザーがそのテキストを選択すると (コピー メニューが表示されます)、その特定の UITextView を含むセルは機能しなくなります。UITableView は、そのセルに対して willDisplayCell メソッドと cellForRowAtIndexPath メソッドを起動しなくなりました。私はいくつかのテストを行い、セルが画面外にあるときにvisibleCells配列から削除され、再び画面に表示されるとvisibleCells配列に戻されますが、デリゲートメソッドは呼び出されていません.
これは、再利用可能なセルを構成できなくなるため、非常に面倒です。これがバグと見なされるかどうかはわかりません。この動作を再確認して確認していただければ幸いです。
これが私の簡略化されたテストコードです。自分で確認できます。
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
tableData = [[NSArray alloc]initWithObjects:@"First Text",@"Second",@"Third",@"Fourth",@"5th",@"6th",@"7th",@"8th",@"9th",@"10th",@"11th",@"12th",@"13th", nil];
self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];
self.tableView.backgroundColor = [UIColor darkGrayColor];
self.tableView.dataSource = self;
self.tableView.delegate = self;
[self.view addSubview:self.tableView];
UIButton* btn = [[UIButton alloc]initWithFrame:CGRectMake(200, 0, 100, 30)];
[btn setBackgroundColor:[UIColor redColor]];
[btn setTitle:@"Clickme" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(onBtnClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark - TableView Datasource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return tableData.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
UITextView* tv = [[UITextView alloc]initWithFrame:cell.contentView.bounds];
[tv setEditable:NO];
[cell.contentView addSubview:tv];
}
for (UIView* subview in cell.contentView.subviews)
{
if([subview isKindOfClass:[UITextView class]])
{
UITextView* tv = (UITextView*)subview;
tv.text = [tableData objectAtIndex:indexPath.row];
}
}
NSLog(@"Configured cell at index: %d", indexPath.row);
return cell;
}
#pragma mark - TableView Delegate
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Will display cell at index: %d", indexPath.row);
}
#pragma mark - Button callback handlers
-(void)onBtnClick:(id)sender
{
NSLog(@"Number of visible cells: %d",[self.tableView visibleCells].count);
}
このコードを実行すると、最初のセルでテキストを選択すると、セルが再び画面に表示されたときにテーブルビューがデリゲート イベントの発生を停止することがわかります。ボタンを押すと、表示されているセルの数が常に正しいことを確認できます。つまり、セルが表示されているセルのリストに追加および削除されていることを意味します。起動されないのはコールバック デリゲートだけです。