2012-03-20 13 views
8

Sto cercando di implementare una vista simile a quella delle impostazioni dell'applicazione di calendario di Apple, ora di inizio e ora di fine. Ho una vista fantastica, ma sto riscontrando due problemi. Innanzitutto, voglio che la prima riga venga selezionata automaticamente. I sorta di avere questo funzionamento utilizzando:Mantenimento della selezione all'aggiornamento di UITableView via reloadData

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0]; 
[dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 

Tuttavia, un'animazione spettacoli, selezionando visivamente il rown quando la vista è caricato, voglio che già selezionato al caricamento vista.

Il secondo, e molto più importante, problema è che quando ricarico i dati dopo che il raccoglitore è aggiornato, perdo la selezione e il mio compito semplicemente non funziona.

Ora so che questa è l'azione predefinita di reloadData, sto cercando un metodo alternativo per raggiungere il mio obiettivo, o forse come posso aumentare il reloadData per non deselezionare la selezione corrente.

Il mio compito è riportato qui di seguito:

-(IBAction)dateChanged 
{ 

    NSIndexPath *index = self.dateTableView.indexPathForSelectedRow; 
    if(index == 0) 
    { 
     if (self.date2 == plusOne) { 
      self.date = [datePicker date]; 
      plusOne = [self.date dateByAddingTimeInterval:60*60]; 
      self.date2 = plusOne; 
     } 
     else 
     { 
      self.date = [datePicker date]; 
     } 

    } 
    else{ 
     self.date2 = [datePicker date]; 
    } 

    [dateTableView reloadData]; 
} 

Nota: plusone è una variabile che inizialmente indica un'ora dal momento in corrente.

Grazie in anticipo!

+0

Da quale metodo si chiama il primo blocco di codice? – MishieMoo

risposta

13

Per il primo problema, impostare animato: NO sulla chiamata al metodo. Attualmente lo stai impostando su SÌ.

[dateTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionBottom]; 

Per il secondo problema, non è davvero chiaro cosa si sta cercando di selezionare dopo aver ricaricato i dati, ma vedo un problema con questa linea:

if(index == 0) 

Stai chiedendo se il puntatore l'oggetto è 0. Penso che quello che vuoi sia controllare che index == nil o che index.section == 0 && index.row == 0 o qualcosa del genere.

In ogni caso, se si chiama reloadData su UITableView, si perderà la selezione. A quel punto, è necessario selezionare una nuova riga. Se nel modello di dati è presente un elemento che si desidera selezionare, è necessario capire dove si trova e selezionarlo in base alla posizione in cui si troverà nella tabella (È necessario saperlo perché le informazioni vengono fornite nel delegato UITableViewDataSource metodi.). In alternativa, se si desidera selezionare NSIndexPath salvato nella prima riga di dateChanged, selezionarlo dopo aver ricaricato i dati.

+0

Grazie! Non posso credere di averlo perso! – Jerome

+0

Fantastico, è stato in grado di risolverlo in base a ciò che hai detto. Aggiunto index.row e riselezionato dopo reloadData senza animazione. Grazie mille, rock! – Jerome

+0

@BrianCooley dove scrivere la riga datatableview ?? – Muju

1

Per il primo problema, scrivi il tuo codice in didSelectRowAtIndexPath: in un metodo. È quindi possibile chiamare questo metodo da didSelectRowAtIndexPath: Si dovrebbe passare indexPath come argomento alla funzione come,

-(void)doActionsInDidSelectRow:(NSIndexPath*)indexPath{ 
    // write code. 
} 

In viewDidLoad chiamare questo metodo come

-(void)viewDidLoad{ 

     NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0]; 
     [dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 
     [self doActionsInDidSelectRow:indexPath]; 
} 

Per il secondo problema il mio suggerimento è, di volta in volta quando si seleziona una cella memorizza il testo di una cella in una NSString. Quando si ricaricano i dati, all'interno di cellForRowAtIndexPath: basta confrontare il testo della cella con il contenuto della stringa precedentemente memorizzato. Se sono uguali, effettuare la selezione utilizzando

[dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 

metodo. Spero che questo risolva i tuoi problemi.

Problemi correlati