我正在创建一个列出Documents字典中文件的iOS。我想在UITableView中显示这些数据,问题是它无法正常工作。
它将数据加载到视图中。 然后应用程序冻结并调用EXC_BAD_ACCESS
这是我的代码:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
timesRun = 0;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectoryPath error:nil];
[bundleRoot release];
NSLog(@"Count: %i",[dirContents count]);
return [dirContents count];
}
- (UITableViewCell *)tableView:(UITableView *)tableViewData cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = nil;
int Locatation = indexPath.row;
Locatation++;
cell = [tableViewData dequeueReusableCellWithIdentifier:@"MyCells"];
if (cell == nil) {
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCell"]autorelease];
}
//cell.textLabel.text = [NSString stringWithFormat:@"Cell: %i",Locatation];
cell.textLabel.text = [dirContents objectAtIndex:timesRun];
timesRun++;
return cell;
NSLog(@"Did return");
}
- (void)tableView:(UITableView *)tableViewDat didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSLog(@"%@",cell.textLabel.text);
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
答案 0 :(得分:1)
这显示了对表视图数据源概念的基本误解。
我的建议:
创建一个包含任何tableview方法之外的文件的数组。然后使用该数组来提供tableview。
使用array.count返回numberofrowsatindexpath。 此外,在cellforrowatindexpath上提供细胞时,不要使用迭代/计数器。 tableview使用indexpath参数询问数组本身的每个元素。你这样访问它:
id object = [array objectArIndex:indexPath.row]
然后使用objects属性设置单元格的标签。
请阅读有关tableviews的教程。我推荐itunesU Paul hegarty的讲座。他们真的很棒。
聚苯乙烯。您在numberofrowsinsection中释放了bundleRoot对象,您不会保留(或根本不使用)这很可能导致崩溃。
修改强>
稍等一些时间,我修改了你的代码:
//code not tested/written in xcode. Might contain typos
//in your .m file
//in your (private) interface
@property (nonatomic, retain, readonly) NSArray *dirContents;
//in your implementation
@synthesize dirContents=_dirContents;
-(NSArray*) dirContents {
if (!dirContents) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
_dirContents = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectoryPath error:nil] retain];
}
return _dirContents;
//note that if you want to "refresh" the contents you would have to
//release _dirContents and set it to nil or implement this differently
}
-(void) dealloc {
[_dirContents release];
//....
[super dealloc];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [[self dirContents] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = nil;
cell = [tableView dequeueReusableCellWithIdentifier:@"MyCells"];
if (cell == nil) {
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCells"]autorelease];
}
cell.textLabel.text = [[self dirContents] objectAtIndex: indexPath.row];
return cell;
// NSLog(@"Did return"); //this never gets called by the way
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSLog(@"%@",cell.textLabel.text);
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
答案 1 :(得分:0)
我的问题有点像马里奥的回答。 [dirContents count]
返回更高的值,而不是从数组中添加对象的次数。
换句话说,这是一个Out of Bounds错误。< / p>
答案 2 :(得分:0)
请确保您在使用dirContents时没有发布。我相信您不会这样做,只需交叉检查您的代码。