2015-07-21 58 views
2

刪除後重新加載數據我有一個問題,即我似乎無法加載在我的tableView的數據。的tableView reloadData沒有文件目錄

我想要做的是用csv擴展名(我已經完成)在文檔目錄中填充我的tableView,然後按下一個按鈕,刪除所有顯示的文件並更新tableView。 按下按鈕時會刪除文檔目錄中的文件,但不會使用更新的內容重新加載tableView。

  1. 我已經使用斷點來確認正在運行reloadData。
  2. 我已經嘗試使用removeAllObjects在運行前清除我的數組 reloadData使用NSLog確認數組是空的,但是這個 不會更新表。
  3. 我已經嘗試設置陣列零運行reloadData之前,這也不行。
  4. 我已經嘗試將數組中的數據設置爲myArray = @ [];在 之前運行reloadData,這將覆蓋具有空白數據的陣列,但 不會更新該表。
  5. 我一直在使用這種方法,無需 任何成功嘗試:

    dispatch_sync(dispatch_get_main_queue(), ^{ 
           [self.tableView reloadData]; 
          }); 
    
  6. 我已經檢查了我的代表對的tableView,他們似乎 正確,(其它所有功能在的tableView工程,包括 選擇/取消多項目和刪除個別項目 和每次tableView更新)。
  7. 我也搜索了類似於我的多個不同的問題,仍然沒有找到答案。

有人可以檢查我的方法,並告訴我爲什麼tableView不能正確重裝嗎?我敢肯定它的某些事情我做錯了,但我無法找到它。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    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"]; 
    } 

    _docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [_docPath objectAtIndex:0]; 
    _fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:nil]; 
    NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.csv'"]; 
    _csvFilesCell = [_fileList filteredArrayUsingPredicate:fltr]; 
    NSLog(@"Contents of directory: %@", _csvFilesCell); 
    filePathsArray = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:documentsDirectory error:nil]; 
    cell.textLabel.text = [_csvFilesCell objectAtIndex:indexPath.row]; 

    return cell; 
} 

-(IBAction) deleteStoredData:(id)sender 
{ 

    NSLog(@"Delete data button pressed"); 

    UIAlertController*alert = [UIAlertController alertControllerWithTitle:@"Delete stored Data" message:@"Are you sure?" preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction* OK = [UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { 
     NSFileManager *manager = [NSFileManager defaultManager]; 

     // the preferred way to get the apps documents directory 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 

     // grab all the files in the documents dir 
     NSArray *allFiles = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil]; 

     // filter the array for only csv files 
     NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.csv'"]; 
     NSArray *csvFiles = [allFiles filteredArrayUsingPredicate:fltr]; 

     // use fast enumeration to iterate the array 
     for (NSString *csvFile in csvFiles) { 

      NSLog(@"PATH %@ : FILE %@", documentsDirectory, csvFile); 

      NSError *error = nil; 

      [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@", documentsDirectory, csvFile] 
                 error:&error]; 

      NSLog(@"Error: %@", error); 
      NSLog(@"OK button selected, all data deleted"); 

      [self updateDeleteButton]; 

      [self.tableView reloadData]; 
      [alert dismissViewControllerAnimated:YES completion:nil]; 


     } 
    }]; 

    UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     NSLog(@"Cancel button selected, no data deleted"); 
     [alert dismissViewControllerAnimated:YES completion:nil]; 
    }]; 
    [alert addAction:OK]; 
    [alert addAction:cancel]; 
    [self presentViewController:alert animated:YES completion:nil]; 

} 
+0

它會不會解決您的問題,但你可以外面的呼叫轉移到'reloadData'和'dismissViewControllerAnimated' for循環。它效率低下,可能導致未定義的行爲。 – tomahh

+0

謝謝你這樣做。 –

回答

0

看到你的代碼後,我想出了以下解決方案,希望它能幫助你!

_docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [_docPath objectAtIndex:0]; 
_fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:nil]; 
NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.csv'"]; 
_csvFilesCell = [_fileList filteredArrayUsingPredicate:fltr]; 
NSLog(@"Contents of directory: %@", _csvFilesCell); 
filePathsArray = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:documentsDirectory error:nil]; 

上面的代碼應該在點擊刪除按鈕時觸發,而不是在tableview的數據源方法中觸發。之後,你應該重新加載您的tableview和你的cellForRowAtIndexPath方法應該是這樣的:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"]; 
     } 
     cell.textLabel.text = [_csvFilesCell objectAtIndex:indexPath.row]; 
     return cell; 
    } 
+0

謝謝你的上述,不幸的是這個建議沒有奏效,但它給了我一些其他可能的解決方案的想法,但他們也沒有工作。我假設通過從** cellForRowAtIndexPath **中刪除數組,您意味着它們可以在其他位置運行,只需將它們完全刪除即可,它在視圖加載時在表中創建了一個錯誤。我試圖將它們實施到** viewDidLoad **工作,但也沒有解決問題。將上面提到的代碼添加到** deleteStoredData **方法中導致應用程序在按下按鈕時停止工作。 –