UITableView在行选择上崩溃

时间:2013-07-10 19:45:05

标签: ios xcode uitableview

在我的应用程序中,我有一个开关,用于确定如何填充tableView。如果选择了一侧,它将显示xml源中的所有项目,而如果选择另一侧,则仅显示已下载到设备的那些项目。首次打开应用程序时,它默认显示所有项目,并且可以毫无问题地选择所有行,并且当选择显示下载时,所有项目都可以选择而不会出现问题;但是,当返回“全部显示”时,如果选择较远的表格单元格,应用程序将崩溃。如果你选择的行比下载的项目数量更远,它只会崩溃,所以我怀疑这与numberOfRowsInSections调用有关,但我不能为我的生活似乎解决它!

这是我在该方法中的代码:

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

if (showDownloadsSwitch.selectedSegmentIndex == 0){

    rows = itemsToDisplay.count; 
}
else if (showDownloadsSwitch.selectedSegmentIndex == 1){
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
    NSUserDomainMask, YES);
    NSString *path = [[paths objectAtIndex:0]
    stringByAppendingPathComponent:@"downloads"];

    NSArray *fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path
   error:&error];
    rows = fileList.count;
}
return rows;
}

编辑:

经过多一点检查,我能够解决它。原来我在[下载objectAtIndex:indexPath.row]检查文件,然后确保表中填充了下载,而不是所有项目。感谢大家的帮助!

3 个答案:

答案 0 :(得分:0)

您可能不应该使用属性来存储行。使它成为局部变量。如果需要访问委托方法之外的表中的行数,请再次单独运行逻辑。

然而,fileList局部变量看起来应该是属性。你在didSelectRowAtIndex方法中引用一个simar数组,对吧?那里会有差异吗?

<强>更新

- (void)viewDidLoad
{

  self.itemsToDisplay      = ...
  self.fileList            = ...
  self.showDownloadsSwitch = ...

  [self.showDownloadsSwitch addTarget:self.tableView
                               action:@selector(reloadData)
                     forControlEvents:UIControlEventValueChanged];
}

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  if (section == 0 && self.showDownloadsSwitch.selectedSegmentIndex == 0)
    return self.itemsToDisplay.count;

  if (section == 1 && self.showDownloadsSwitch.selectedSegmentIndex == 1)
    return self.fileList.count;

  return 0;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  if (indexPath.section == 0)
    [self.itemsToDisplay objectAtIndex:indexPath.row];
  else
    [self.fileList objectAtIndex:indexPath.row];
}

答案 1 :(得分:0)

尝试包含此内容。

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    UIView *view=[[UIView alloc] init];
    return view;
}

如果选择了第二个选项,则不允许显示更多行。

答案 2 :(得分:0)

我认为您的数组是空的,请尝试以下方案

NSArray *fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path
   error:&error];
if(fileList)
{
    rows = fileList.count;
}
else
{
 // handle your error
}