0

Bellow 我有一些代码可以从我的应用程序存储在 idevice 上的文档目录中检索文件。然后它成功地检索到该文件的路径,该文件是一个 mp4,因为这就是我正在存储的内容。并通过在UiTableView我创建的单元格中显示文件名来做到这一点。但是,该代码仅在一个单元格中显示一个文件。但是我想在自己的单元格中单独列出多个文件,以便最终用户可以根据他们想要的视频文件单独选择该单元格。

这是检索并显示文件的文件目录但未在表中列出多个文件的代码:

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


}

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

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if(!filePathsArray)  // 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;
}


-(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 = [filePathsArray[indexPath.row] lastPathComponent];
    return cell;
}
4

3 回答 3

3
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if(!filePathsArray)
    {
        if ([filePathsArray count] > 0)
            return [filePathsArray count];
        else
            return 1;
    }

    return 1;
}

应该读:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [filePathsArray count];
}
于 2013-07-01T21:18:04.190 回答
1

在正常情况下,您应该[filePathsArray count];从您的方法返回。numberOfRowsInSection现在,您实际上在所有情况下都从该方法返回 1。我不确定您到底要对numberOfRowsInSection方法顶部的逻辑做什么,但我认为您应该首先将整个方法体替换为return [filePathsArray count];.

还有一件事:您在其中有一条评论“如果数据加载已完成”,但您发布的代码中的所有工作都在主线程上同步进行。当您的viewDidLoad方法完成时,您的filePathsArray已初始化。你不需要做任何棘手的事情来解释filePathsArray仍然为零的情况,除非你担心在视图控制器的视图实际加载之前表视图加载数据。但这会很奇怪。

于 2013-07-01T21:15:54.087 回答
0

为什么要一遍又一遍地初始化filePathsArray,首先在viewDidLoad 下,然后在tableview 下。

这就是我编写代码的方式。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

//initializing array and getting values the first time when page loads.
    filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];


}

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

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

//return whatever the count of this array is. no need to do any if! checks  
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"];
    }

    cell.textLabel.text = [filePathsArray[indexPath.row] lastPathComponent];
    return cell;
}
于 2013-07-01T22:32:26.047 回答