Objective-C:如何将文档目录中的文件列入UITableView?

下面我有一些代码将文档目录中的文件列入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; } 

在你的代码中,你正在使用cellForRowAtIndexPath:填充数组,显然

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

cellForRowAtIndexPath之前调用。 因此,您需要在重新加载表视图之前初始化数组的内容。 将以下行放在ViewDidLoad或viewWillAppear中:

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

你应该像以下一样处理:

 -(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; } 

请注意,当没有文件或加载数据时,我返回1,您可以在该单元格中显示“正在加载数据…”或“找不到记录”之类的消息。 确保将该单元的userInteractionEnabled设置为NO ,否则如果逻辑未正确实现,则可能导致不一致。

tableView:numberOfRowsInSection:被调用时,filePathsArray为nil,因此从此方法返回0。 你的代码基本上说“我的tableView中没有行”。
如果tableView没有任何行,tableView不会要求单元格。 因此,永远不会调用填充数组的方法。

将以下3行代码移动到- (void)viewDidLoad- (void)viewWillAppear:(BOOL)animated

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil]; 
 -(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]; }