在我的应用程序中,我有一个开关,用于确定如何填充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]检查文件,然后确保表中填充了下载,而不是所有项目。感谢大家的帮助!
答案 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
}