複数の成分を選択できる複数選択リストを作成しました。
私のテーブルビューでは、Ingredient のリスト プロパティに基づいて、セルを有効または無効にすることができます。Ingredient's list プロパティが設定されている場合、セルは無効になります。
ただし、セルを再利用すると、期待どおりに表示されません。以下の画像は、私よりも効果的に問題を説明しています。
(有効にすべきではない材料は、ケーキのアイシング、コンデンス ミルク、コーンフラワーです。)
最初の画像は、期待どおりに無効化され、注釈が付けられた 3 つの Ingredients を示しています。
ただし、2 番目の画像では、下にスクロールすると、一部の成分が無効になっていることがわかります (ただし、それらを選択することはでき、それらは完全に相互作用します)。
3 番目の画像は、スクロールして一番上まで戻った後のリストを示しています。一部の材料はグレー表示されており、対話/選択できないにもかかわらず、コーンフラワーが有効として表示されていることに注意してください。
問題は、セルの再利用に関するものです。セルは再使用時に「リセット」されていないようで、「古い」外観の一部が保持されています。
以下は のコードcellForRowAtIndexPath:
です。ここに問題があると確信しています (ただし、何が問題なのかはわかりません)。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Fetches the corresponding Ingredient from the ingredientArray
Ingredient *ingredient = [self.ingredientArray objectAtIndex:indexPath.row];
if ([ingredient.list isEqualToString:@"Lardr"])
{
cell.userInteractionEnabled = NO;
cell.detailTextLabel.text = @" Already in your Lardr";
}
else if ([ingredient.list isEqualToString:@"Shopping List"])
{
cell.userInteractionEnabled = NO;
cell.detailTextLabel.text = @" Already on your Shopping List";
}
else
{
cell.userInteractionEnabled = YES;
cell.detailTextLabel.text = @"";
}
// Add a checkmark accessory to the cell if the ingredient is on the selectedIngredients array
if ([self.selectedIngredients containsObject:ingredient])
cell.accessoryType = UITableViewCellAccessoryCheckmark;
else
cell.accessoryType = UITableViewCellAccessoryNone;
cell.textLabel.text = ingredient.name;
return cell;
}
私はこれを理解しようとして頭がいっぱいで、リモートでさえ関連しているSOの質問をすべて読みましたが、役に立ちませんでした。どうしたの?!
私の論理では、if ステートメントを介した実行パスに関係なく、セルごとに textLabel、detailTextLabel、userInteractionEnabled、および accessoriesType プロパティが設定されているため、再利用した後でもセルが正しく表示されない理由がわかりません。
編集:問題の根本を突き止めようとして、対応する成分を取得する行のすぐ上に次の行を追加して、セルをデフォルトに「リセット」しようとしましたが、役に立ちませんでした。
cell.userInteractionEnabled = YES;
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
cell.accessoryType = UITableViewAccessoryNone;
ただし、興味深いのは完全に非論理的です - 次の行cell.textLabel.text = ingredient.name
を の行のすぐ下に移動するIngredient *ingredient = [self.ingredientArray objectAtIndex:indexPath.row];
と、 userInteraction がさらに下に設定されていても (そして関連するセルは期待どおりに無効になっています)、どのセルにもスタイリングはまったく適用されません。 .
私が考えているのは、セルのプロパティが設定される順序は重要ですか? いけないのはわかっていますが、上記を踏まえて見た目が変わります。
更新: 問題を解決しました。以下の私の答えを見てください。