これらの質問を見たことがあると言って始めましょう:
iOS: スクロールが速すぎると UITableView がデータを混同する
(カスタム) スクロール後に UITableViewCell が混同される
最初と最後は私の問題に非常に関連しているように見えましたが、セル (データ) に何を表示するかを決定するためのロジックが各セクションにあることはかなり確信していますが、それでもまだ混乱しています。
関連するコードは次のとおりです。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Note: the if (cell == nil) thing is no longer required in iOS 6
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
if (closestRenter != nil)
{
NSLog(@"CLOSEST RENTER!");
[self setupCellsWithClosestRenterCell:cell atIndexPath:indexPath];
}
else
{
NSLog(@"NO CLOSEST RENTER");
[self setupCellsWithNoClosestRenterCell:cell atIndexPath:indexPath];
}
if (indexPath.section == 0)
{
for (UIView *view in cell.contentView.subviews)
{
NSLog(@"WHAT THE HECK");
[view removeFromSuperview];
}
}
return cell;
}
関連情報はこちら:
1) ClosestRenter は nil ではありません...存在します。したがって、else 句は決して実行されるべきではありません...そしてそうです。
2) コード内:
[self setupCellsWithClosestRenterCell:cell atIndexPath:indexPath];
簡単なものがあります:
if (indexPath.section == 0)
{
cell.textLabel.text = @"PLACE HOLDER";
}
else
{
// Populate the cell with data. (creates a view (with controller etc) and loads it into the cell)
}
3) 常に 2 つのセクションがあります。
問題は、セクション 0 (最初のセクション) にはそのプレースホルダー文字列しかないことです。セクション 1 には、カスタム サブビューを含める必要があります (セル内に含まれています)。
セクション 0 には最初はプレースホルダー文字列しかありませんが、下にスクロールすると (セクションが表示されなくなります)、上にスクロールして (すばやく) 戻ると、セクション 1 のランダムなセルが表示されることがあります...一体何ですか? どのように?セルの再利用を非難するのは気が進まないのですが、この時点では本当にばかげたこと以外に、それが何であるかはわかりません。
ここで気になるのは、セクション 0 のセル (そこには 1 行しかない) にサブビューがないことです。しかし、上下にすばやくスクロールすると、(セクション1から明らかに)1つ取得され、「WHAT THE HECK」ログメッセージが表示されます...
for ループ (メッセージが表示されるループ) を使用すると問題が解決することは言及する価値があります (不要なサブビューが削除されるため) が、より良い方法が必要です。今は気分が悪い。
何か案は?
(これを重複として自由にマークしてください。ただし、ここで何か他のことが起こっていると確信しています)。
ありがとう。