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];
哇更可读,我完全忘记检查从调试器调用堆栈。感谢您的建议,这是NSLog中numberOfRowsInSection的一个问题:我在尝试执行%@时应该使用%d。谢谢! – 2009-11-17 15:02:19
恨我的调试代码导致错误... – wkw 2009-11-18 12:50:41
你也可以使用indexPath.row ... – 2011-11-06 00:00:13