UITableView reloadData上的EXC_BAD_ACCESS调用

UITableView reloadData上的EXC_BAD_ACCESS调用

问题描述:

我已经到了将这头发拉出来的地步。当我调用UITableView的reloadData时,我不断收到EXC_BAD_ACCESS。我会在这里为你奠定基础。UITableView reloadData上的EXC_BAD_ACCESS调用

MainViewController.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

@class iPROSAppDelegate; 

@interface MainViewController : UIViewController <UIScrollViewDelegate, UITableViewDelegate, UITableViewDataSource> { 
iPROSAppDelegate *parent; 

... 

NSMutableArray *contentSeqList; 
UITableView *contentSeqTable; 
} 

@property (nonatomic, retain) IBOutlet iPROSAppDelegate *parent; 
... 
@property (nonatomic, retain) NSMutableArray *contentSeqList; 
@property (nonatomic, retain) IBOutlet UITableView *contentSeqTable; 
... 
- (IBAction)changeMainView:(id)sender; 

@end 

MainViewController.m当点击在主视图中的按钮

- (IBAction)changeMainView:(id)sender{ 
    //do logs to make sure we get here and grab an NSDictionary object from another class 
NSLog(@"got to a change of main view"); 
NSDictionary *myContentSequences = [[parent csList] grabCSListandReturnJSON:[sender tag]]; 
NSLog(@"got cs list for tag %@: %@", [sender currentTitle], myContentSequences); 

    //set up table view 
contentSeqTable = [[UITableView alloc] initWithFrame:CGRectMake(40, 20, 240, 300) style:UITableViewStyleGrouped]; 
contentSeqTable.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
[contentSeqTable setDelegate:self]; 
[contentSeqTable setDataSource:self]; 
NSLog(@"delegate: %@, data source: %@", [contentSeqTable delegate], [contentSeqTable dataSource]); 
contentSeqList = [[NSMutableArray alloc] init]; 

    //populate nsmutablearray contentseqlist using the nsdictionary mycontentsequences 
for (id dashboard in [myContentSequences objectForKey:@"dashboards"]){ 
    if ([dashboard objectForKey:@"error"] == nil){ 
    for (id contentsequence in [dashboard objectForKey:@"contentSequences"]){ 
    [contentSeqList addObject:[contentsequence objectForKey:@"name"]]; 
    NSLog(@"added object to content sequence list: %@", [contentsequence objectForKey:@"name"]); 
    } 
    } 
} 
[contentSeqTable reloadData]; 
... 
} 

changeMainView被调用。以下是UITableView的委托方法。请注意,NSLogs是这些方法的第一行,但在EXC_BAD_ACCESS之前,我没有在控制台日志中显示。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
NSLog(@"content seq list count: %@", [contentSeqList count]); 
return [contentSeqList count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
NSLog(@"setting up the cells"); 
NSUInteger index = [indexPath indexAtPosition:1]; 

NSString *myId = @"id"; 
if (tableView.editing) myId = @"idE"; 

UILabel *name; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myId]; 

if (cell == nil){ 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 20) reuseIdentifier:myId] autorelease]; 

    float width = 260; 
    if (tableView.editing) width = 240; 

    name = [[[UILabel alloc] initWithFrame:CGRectMake(45, 1, width, 53)] autorelease]; 
    [name setBackgroundColor:[UIColor clearColor]]; 
    [name setTextColor:[UIColor blackColor]]; 
    [name setFont:[UIFont fontWithName:@"Helvetica" size: 18]]; 
    [name setAdjustsFontSizeToFitWidth:YES]; 
    [name setMinimumFontSize:11]; 
    [name setNumberOfLines:2]; 

    name.tag = 1; 

    [cell.contentView addSubview:name]; 

} 
else{ 
    name = (UILabel *)[cell.contentView viewWithTag:1]; 
} 

if ([tableView indexPathForSelectedRow]){ 
    if (indexPath == [tableView indexPathForSelectedRow]){ 
    [name setTextColor:[UIColor whiteColor]]; 
    } 
    else{ 
    [name setTextColor:[UIColor blackColor]]; 
    } 
} 
else{ 
    [name setTextColor:[UIColor blackColor]]; 
} 

[name setText:[contentSeqList objectAtIndex:index]]; 

return cell; 
} 

委托方法是同一个类MainViewController的一部分。我也在reloadData之前检查过UITableView不是通过NSLog。我知道我必须在这里错过一些小东西。任何建议将不胜感激。谢谢!

EXC_BAD_ACCESS发生时,您能显示调用堆栈吗?

顺便说一句,

NSUInteger index = [indexPath row]; 

NSUInteger index = [indexPath indexAtPosition:1]; 
+0

哇更可读,我完全忘记检查从调试器调用堆栈。感谢您的建议,这是NSLog中numberOfRowsInSection的一个问题:我在尝试执行%@时应该使用%d。谢谢! – 2009-11-17 15:02:19

+4

恨我的调试代码导致错误... – wkw 2009-11-18 12:50:41

+3

你也可以使用indexPath.row ... – 2011-11-06 00:00:13