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

时间:2013-06-30 17:04:19

标签: ios 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;
    }

3 个答案:

答案 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,您可以在该单元格中显示“正在加载数据...”或“找不到记录”之类的消息。确保为该单元格设置userInteractionEnabledNO,否则如果逻辑未正确实施,可能会导致不一致。

答案 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];
}