以编程方式填充TableView错误

时间:2012-04-23 07:40:22

标签: iphone objective-c ios nsmutablearray

当我向下滚动表格视图时出现此错误:

2012-04-23 09:32:36.763 RedFox[30540:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 12 beyond bounds [0 .. 11]'
*** First throw call stack:
(0x13c3052 0x1554d0a 0x13af674 0x5794 0xb3e0f 0xb4589 0x9fdfd 0xae851 0x59322 0x13c4e72 0x1d6d92d 0x1d77827 0x1cfdfa7 0x1cffea6 0x1cff580 0x13979ce 0x132e670 0x12fa4f6 0x12f9db4 0x12f9ccb 0x12ac879 0x12ac93e 0x1aa9b 0x2158 0x20b5)
terminate called throwing an exceptionsharedlibrary apply-load-rules all
Current language:  auto; currently objective-c

在我的.h文件中我有:

@interface MyTableView : UIViewController  <UITableViewDataSource> {
    int currentRow;
}

@property (strong,nonatomic) UITableView *tableView;
@property (strong,nonatomic) ViewBuilder *screenDefBuild;

在我的.m文件中:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [screenDefBuild.elementsToTableView count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
    }

    ScreenListElements *currentScreenElement = [screenDefBuild.elementsToTableView objectAtIndex:currentRow]; //exception points here!
    cell.textLabel.text = currentScreenElement.objectName;

    currentRow++;    
    return cell;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    [tableView setDataSource:self];
    [self.view addSubview:tableView];
}

这有什么问题?

2 个答案:

答案 0 :(得分:2)

currentRow变量是不必要的并导致问题!

修复:

更改行

 ScreenListElements *currentScreenElement = [screenDefBuild.elementsToTableView objectAtIndex:currentRow]; //exception points here!

 ScreenListElements *currentScreenElement = [screenDefBuild.elementsToTableView objectAtIndex:indexPath.row]; //exception points here!

原因:

每次调用currentRow时都会增加cellForARowAtIndexPath:,这是错误的,因为此方法不仅在显示以下单元格时(向下滚动时)调用,而且在向上滚动时调用(所以{ {1}}然后应该减少)。这就是为什么Apple放置参数currentRow以便您可以轻松确定哪个单元tableView正在请求。

答案 1 :(得分:1)

currentRow对我来说真的没有意义。 返回包含源数组行的单元格(elementsToTableView) 你需要在当前索引路径中询问行。

您的导致错误的行应如下所示:

ScreenListElements *currentScreenElement = [screenDefBuild.elementsToTableView objectAtIndex: indexPath.row];

你根本不需要currentRow。 你为什么这样实现呢?