Poniższy problem nie występuje w wersji IOS przed 7.dequeueReusableCellWithIdentifier powrocie komórki w stanie edycji w IOS 7
Korzystanie interfejs UITableView za slide-to-edit do usuwania elementów, po usunięciu elementu i przewijany nowo wyświetlane komórki (wrócił z dequeueReusableCellWithIdentifier
) wygląda następująco:
https://dl.dropboxusercontent.com/u/87749409/Screenshot%202013.09.27%2016.08.30.png
[ten obraz może nie być dostępne zawsze, tak oto opis: Po przewijania, nowa komórka jest nadal w końcowej redakcją państwa, z przycisk DELETE jest nadal widoczny, a zawartość komórki wynosi f-screen po lewej.]
Ponadto zwrócona komórka ma nawet ustawioną flagę editing
.
Kod używam usunąć komórki wygląda następująco:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete)
{
// Find the item that this cell represents
NSDictionary *item = [self itemForRowAtIndexPath:indexPath];
if (!item) return;
[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
[tableView endUpdates];
// Remove it from the data store
[Inventory removeInventoryItem:item];
}
}
udało mi się przezwyciężyć ten z zaatakowaną rozwiązania. Kod (z hack) to:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
InventoryCell *cell = [tableView dequeueReusableCellWithIdentifier:kInventoryCellID];
// HACK - here we create a new cell when we try to reuse deleted cells.
// Deleted cells, when re-used, would still appear as if they were edited,
// with the cell slid off to the far left and the DELETE button visible.
while(cell && cell.editing)
{
cell = [tableView dequeueReusableCellWithIdentifier:kInventoryCellID];
}
if (!cell)
{
cell = [[InventoryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kInventoryCellID];
}
return cell;
}
Za pomocą hacka (pętla while) generowana jest nowa komórka, która nie znajduje się w stanie edycji. To prowadzi do odrobiny zmarnowanej pamięci, ale daje prawidłowy wynik.
Zastanawiam się, czy jest coś, co muszę zrobić w metodzie prepareForReuse
, aby zresetować stan edycji. Obecnie moja metoda prepareForReuse
inicjuje tylko formanty wewnątrz (etykiety itp.) Z wartościami domyślnymi.
Próbowałem nazywając setEditing:animated:
na obydwu, a UITableViewCell UITableView podczas usuwania komórkę, w prepareForReuse
a gdy dequeueReusableCellWithIdentifier:
powrócił komórkę jeszcze zestaw editing
flagi, ale nic nie wydaje się, aby rozwiązać ten problem.
Dzięki Leo, to było to! Nie myślałem o tym od czasu, w którym analizowałem ten problem (wraz z kilkoma innymi) przez ostatnie dwa dni i żadna z uruchomionych przeze mnie implementacji nie nazywała się prepreForReuse (po prostu dwukrotnie sprawdziłem). Jako pokutę opublikuję notatkę na te pytania i blogi SO, które powinny zrobić. – pauln
Pozdrawiam! Mówi tak jasno w dokumentacji, ale w rzeczywistości rzadko jest to nazywane. –
PRZED: "Po co czytać dokumenty? Wiem, co to robi ... to jest wywoływane, aby umożliwić ci zresetowanie komórki do wartości domyślnych przed ponownym użyciem." AFTER: "Hej, doktorku, mam to płaskie miejsce na moim czole ..." – pauln