2013-09-27 15 views
14

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.

Odpowiedz

32

Miałem ten problem, a odpowiedź była dla mnie momentem "doh". Upewnij się, że wywołujeszimplementację prepareForReuse we własnej implementacji.

+2

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

+0

Pozdrawiam! Mówi tak jasno w dokumentacji, ale w rzeczywistości rzadko jest to nazywane. –

+1

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

Powiązane problemy