Domanda

Ho un NSMutableArray e io carico la mia Tableview da esso. Ora ho un pulsante nell'interfaccia utente che lascia un pò l'utente aggiorna i dati che va nella matrice più volte. E ogni volta che ci sono nuovi dati della matrice voglio aggiornare la tableView. Solo facendo [tableView reloadData] dopo aver aggiornato la matrice sembra portare il beachball. Tutte le idee su quello che sarebbe un buon modo per raggiungere questo obiettivo?

Inoltre ho preso uno sguardo al binding come un modo per implementare il mio NSTableView da un array, ma tutti gli esempi mostrati l'uso online attacchi quando vogliono aggiungere dati ai loro tavoli? Qualcuno mi può punto su come avrei potuto caricare un array con dati in tableView utilizzando le associazioni?

Scusate se le domande sono quelle noobie, io sono disposto a leggere se qualcuno mi può indicare i dati corretti. Thanks :) (io non sono alla ricerca di una scorciatoia, solo cercando di ottenere qualche consiglio imparato dalla gente con esperienza su come affrontare queste cose)

-(IBAction)refreshList:(id)sender
{
//setup array here and sort the array based on one column. This column has 
  identifier 'col1' and it works as expected


[aTable reloadData];
  } 

- (int) numberOfRowsInTableView:(NSTableView *)aTable
{ // return count of array
 }

- (id)tableView:(NSTableView *)aTable objectValueForTableColumn: (NSTableColumn *)          
tableColumn row:(int)row
 { 
 //set up arrays here to load data in each column


 }
- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray   
 *)oldDescriptors
 {
 //sort here when column headers are clicked
 } 

 -(IBAction)autorefresh:(id)sender
   {

 // Here i am trying to reload the array and refresh the tableView. I want to       
  constantly keep refreshing the array and loading the tableView here. The array does 
  get   refreshed but I am having trouble loading the tableView.


  for ( int i =0; i<=2;i++)
  { 
     // reload the array with data first.
  [aTable reloadData];
    i = 1;

  } 
È stato utile?

Soluzione

Con il codice (e in particolare il vostro molto romanzo "while true" loop), si ottiene una spiaggia-ball perché non hai mai tornare all'uomo RUN-loop. Per risolvere utilizzare il codice come questo dopo aver configurato la NSTableView, e verrà eseguito ogni 1,0 secondi

NSTimer* timer = [NSTimer timerWithTimeInterval:1.0
                                         target:[NSApp delegate]
                                       selector:@selector(myReloadData:)
                                       userInfo:nil
                                        repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];  

Quindi creare myReloadData nella vostra applicazione delegato

- (void)reloadMyData:(NSTimer*)ntp
{
  // reload the array with data first.
  [aTable reloadData];
}

Altri suggerimenti

Se -reloadData sta causando un pallone da spiaggia quasi certamente significa che c'è qualcosa che non va con l'attuazione del controller del protocollo NSTableDataSource. È necessario capire perché questo sta accadendo e risolvere il problema. Se pubblichi il codice sorgente di dati tavolo allora forse possiamo aiutare a capire perché questo è.

mi raccomando di acquisire familiarità con i metodi "standard" NSTableView DataSource e delegato Prima ancora di guardare binding. Cacao binding è un argomento relativamente avanzato e moltissimo Sembra che avete bisogno di esperienza più di base di cacao prima di passare ad attacchi.

Detto questo, la pagina ha un insieme completo di cacao attacchi esempi:

http://homepage.mac.com/mmalc/CocoaExamples/controllers.html

Aggiorna da quando hai postato il tuo codice:

Devo presumere che hai volutamente lasciato fuori l'attuazione dei metodi di origine dati del codice di cui sopra, dal momento che il codice come hai postato non si compila senza avvisi.

Il tuo metodo autorefresh è un ciclo infinito. Questo spiegherebbe il beachballing. Si imposta i a 1 per ogni iterazione del ciclo, il che significa che non è mai viene raggiunta la condizione finale.

Tuttavia, utilizzando un ciclo for come questo è un pessimo, pessimo modo per aggiornare una visualizzazione per tabella e bloccherà il thread principale. Se è necessario aggiornare più volte la visualizzazione della tabella su base regolare, utilizzare un NSTimer che si chiama a un intervallo specificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top