下面我有一些代码将文档目录中的文件列为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;
}
答案 0 :(得分:4)
在您的代码中,您正在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
,否则如果逻辑未正确实施,可能会导致不一致。
答案 1 :(得分:2)
当调用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];
答案 2 :(得分: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];
}