0

テーブル ビューを下にスクロールすると、次のエラーが表示されます。

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];
}

それの何がいけないの?

4

2 に答える 2

2

変数は不要であり、currentRow問​​題を引き起こしています!

修正するには:

行を変更する

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

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

理由:

このメソッドは、次のセルを表示するとき (下にスクロールするとき) だけでなく、上にスクロールするときにも呼び出されるため (その場合はデクリメントする必要があります)、呼び出されるcurrentRowたびにインクリメントしますが、これは間違っています。そのため、Apple はパラメーターを配置して、どのセル tableView が要求しているかを簡単に判別できるようにしています。cellForARowAtIndexPath:currentRowindexPath

于 2012-04-23T07:50:31.813 に答える
1

currentRow は、私には意味がありません。ソース配列 (elementsToTableView) の行を含むセルを返すには、現在のインデックス パスで行を要求する必要があります。

エラーの原因となる行は次のようになります。

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

また、 currentRow はまったく必要ありません。なぜそのように実装したのですか?

于 2012-04-23T07:50:33.630 に答える