UITableView显示数据然后崩溃

时间:2012-07-09 16:45:23

标签: objective-c uitableview exc-bad-access

我正在创建一个列出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];
}

3 个答案:

答案 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时没有发布。我相信您不会这样做,只需交叉检查您的代码。