2012-03-31 8 views
12

Ho un problema un po 'strano, e non riesco a capire cosa mi manca. Ho un UITableView che è modificabile sul posto (vale a dire quando il mio UI è caricato, mando la mia tabella il setEditing: YES animato: messaggio YES). L'ultima riga della tabella è destinata alla riga "Aggiungi nuovo". Tutte le file tranne l'ultima riga nella mia tabella possono essere spostate. Nessuna delle righe può essere cancellata.Impossibile spostare le righe in un UITableView anche se sono visualizzate grabber

Le righe vengono visualizzate correttamente e i grabber vengono visualizzati sul lato destro di tutte le righe tranne l'ultima riga (come previsto). Il problema è che non riesco a spostare le righe. Quando tocco il grabber per spostare la riga, è un tipo di jiggles in atto, ma non riesco a trascinarlo verso l'alto o verso il basso. Ecco il relativo frammento di codice:

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return UITableViewCellEditingStyleNone; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == [self.itemArray count]) { 
     return NO; 
    } 
    return YES; 
} 

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == [self.itemArray count]) { 
     return NO; 
    } 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    Item *item = [self.itemArray objectAtIndex:fromIndexPath.row]; 
    [self.itemArray removeObjectAtIndex:fromIndexPath.row]; 
    [self.itemArray insertObject:item atIndex:toIndexPath.row]; 
} 

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { 
    if ([proposedDestinationIndexPath row] < [self.itemArray count]) { 
     return proposedDestinationIndexPath; 
    } 
    NSIndexPath *betterIndexPath = [NSIndexPath indexPathForRow:[self.itemArray count]-1 inSection:0]; 
    return betterIndexPath; 
} 

Per cercare di eseguire il debug, sembra che il tableView: moveRowAtIndexPath: viene chiamato quasi immediatamente anche se ho in mano al grabber (vale a dire che non ho ancora alzato il dito). Inoltre, my tableView: targetIndexPathForMoveFromRowAtIndexPath: proposedDestinationIndexPath: non viene invocato affatto.

Qualche idea su cosa sto sbagliando? Qualche suggerimento su cosa dovrei provare a risolvere questo problema?

+0

Possibile duplicato di [Impossibile trascinare UITableViewCell dalla posizione corrente durante il riordino] (http://stackoverflow.com/questions/9251735/cant-drag-uitableviewcell-from-its-current-position-when-reorder) – Daniel

risposta

22

ho avuto anche questo problema. Controlla se hai un UIGestureRecognizer (per me è stato un UIPanGestureRecognizer) che è allegato alle anteprime di UITableView. L'ho rimosso e il riordino ha funzionato.

+0

Sì, questo era esattamente il problema che alla fine ho capito. – Umair

1

Il metodo tableView:moveRowAtIndexPath:toIndexPath: viene chiamato immediatamente dopo aver toccato il controllo. Da UITableViewDataSource Protocol Reference:

L'oggetto UITableView invia questo messaggio all'origine dati quando l'utente preme il controllo di riordino in fromRow.

Quindi questo è il comportamento previsto.

Credo che il problema sia nel tuo tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:. Hai una ragione specifica per includere questo metodo? Hai provato a lasciarlo fuori e andare con la posizione proposta?

Per esempio, sembra che ([proposedDestinationIndexPath row] < [self.itemArray count]) sarà sempre tornare true ...

+0

Anche sbarazzarsi della tabellaView: targetIndexPathForMoveFromRowAtIndexPath: toProposedIndexPath: il metodo non risolve il problema. L'intento di questo metodo è che l'ultima riga (la riga "Aggiungi nuovo") non deve essere spostata e non è possibile spostare altre righe al di sotto di essa. – Umair

2

Recentemente ho avuto lo stesso problema e questo thread mi ha indirizzato nella giusta direzione, ma l'approccio migliore è quello di utilizzare il metodo delegato del gesture recognition gestureRecognizerShouldBegin: per determinare se ci si trova in una situazione in cui si desidera elaborarlo o meno .

Nella mia situazione ho avuto un gesto di scorrimento su un controller di visualizzazione principale e stavo visualizzando una tabella in un controller di visualizzazione figlio. In gestureRecognizerShouldBegin: restituisco un NO quando il controller della vista figlio è attivo, il che consente alla tabella di vedere ogni gesto e il controller della vista del contenitore non gestisce nulla.

28

Ho avuto lo stesso problema e @wilsontgh & @Andy le risposte mi hanno portato nella giusta direzione. Tuttavia, non potevo permettermi di rimuovere il PanRecognizer necessario dal superview, né disabilitarlo in certe viste. Ciò che ha funzionato per me è stato impostare questo sul riconoscitore della vista principale, che evita di cancellare i tocchi gestiti da altre viste/riconoscitori.

panRecognizer.cancelsTouchesInView = NO; 
+1

Questa è un'ottima soluzione per una situazione * molto * fastidiosa. Stavo usando ViewDeck che gestisce un menu di overflow/navigazione in stile Facebook e quindi il riconoscimento pan gesture nella vista genitore stava causando il caos con il riconoscimento dei gesti di tableview. Saluti. – NSTJ

+3

Per correggere ViewDeck sono stato in grado di impostare 'panningCancelsTouchesInView' su false nel mio' IIViewDeckController' –

+0

cena di pollo vincitore del vincitore !! – xximjasonxx

0

Nel mio caso, è la funzione "Nascondi barra di spostamento in scorrimento" che ha causato il riordino.Quindi assicurati che sia spento se hai bisogno della funzione di riordino di UITableView.

navigationController?.hidesBarsOnSwipe = false

noti che controller di navigazione viene condivisa tra tutti i controller di vista dello stesso stack di spostamento, quindi uno schermo può influenzare tutti gli altri quelli anche dopo la spinta/operazioni pop-ing.

0

Nel mio caso, il problema era nella proprietà keyboardDismissMode.

Problemi correlati