2013-06-30 13 views
5

Di seguito è disponibile un codice che elenca i file dalla directory dei miei documenti in un UITableView. Tuttavia, il codice non funziona correttamente e, una volta eseguito il test sul dispositivo, anche se nella directory dei documenti sono presenti file, non viene elencato nulla, tutti visualizzati solo visualizzando alcune celle vuote. Ecco il codice Attualmente sto usando:Objective-C: come elencare i file dalla directory dei documenti in un UITableView?

NSArray *filePathsArray; 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
    return 1; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [filePathsArray count]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"]; 
     } 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil]; 
     cell.textLabel.text = [documentsDirectory stringByAppendingPathComponent:[filePathsArray objectAtIndex:indexPath.row]]; 
     return cell; 
    } 

risposta

4

Nel codice, si sta riempiendo la matrice in cellForRowAtIndexPath:, e ovviamente

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

viene chiamato prima cellForRowAtIndexPath . Quindi è necessario inizializzare il contenuto dell'array prima di ricaricare la vista tabella. O mettere le seguenti righe nel viewDidLoad o viewWillAppear Metodi:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil]; 

e si dovrebbe fare di movimentazione come:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if(!isDataLoading) // if data loading has been completed, return the number of rows ELSE return 1 
    { 

     if ([filePathsArray count] > 0) 
      return [filePathsArray count]; 
     else 
      return 1; 
    } 

    return 1; 
} 

Si noti che sto tornando a 1 quando non ci sono file o quando il caricamento dei dati è possibile, è possibile visualizzare un messaggio come "Caricamento dati ..." o "Nessun record trovato" in quella cella. Assicurati di impostare userInteractionEnabled su NO per quella cella altrimenti potrebbe causare incongruenze se la logica non è implementata correttamente.

+0

Perché dovrebbe 'numberOfRowsInSection:' restituisce '1' quando non ci sono file? – rmaddy

+0

@maddy: in quella riga è possibile visualizzare un messaggio del tipo: "Nessun record trovato" o qualsiasi messaggio appropriato in modo che l'utente non venga confuso. –

+0

@maddy: assicurati di impostare userInteractionEnabled su No per quella cella –

2

Quando tableView:numberOfRowsInSection: si chiama filePathsArray è pari a zero, in modo da 0 viene restituito da questo metodo. Il tuo codice dice fondamentalmente "non ci sono righe nel mio tableView".
E tableView non richiede una cella se tableView non ha righe. Quindi il tuo metodo che riempie l'array non viene mai chiamato.

spostare i seguenti 3 righe di codice in - (void)viewDidLoad o - (void)viewWillAppear:(BOOL)animated

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil]; 
0
-(NSArray *)listFileAtPath:(NSString *)path 
{  
    int count; 

    NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; 

    for (count = 0; count < (int)[directoryContent count]; count++) 
    { 
     NSLog(@"File %d: %@", (count + 1), [directoryContent objectAtIndex:count]); 
    } 
    return directoryContent; 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    paths = [self listFileAtPath:documentsDirectory]; 
} 
Problemi correlati