6

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

3 回答 3

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,否则如果逻辑未正确实现,可能会导致不一致。

于 2013-06-30T17:17:46.993 回答
2

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

将以下 3 行代码移入- (void)viewDidLoador- (void)viewWillAppear:(BOOL)animated

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];
于 2013-06-30T17:17:12.057 回答
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];
}
于 2017-02-20T22:55:38.350 回答