我在cellForRowAtIndexpath中添加了selectRowAtIndexPath来标记先前选择的行,但是如果滚动tablview会崩溃

yon*_* ho 5 iphone uitableview ios

我正在制作一个自定义UITableView菜单选择器组件。每次选择特定行时,我都会保存该行的索引路径,因此下次用户选择另一行时,人们可以知道他先前选择的行。所以我将其添加到cellForRowAtIndexpath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    cell.textLabel.text = self.left[indexPath.row][@"name"];
    [tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];
    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    cell.textLabel.highlightedTextColor = [UIColor grayColor];
    return cell;
}
Run Code Online (Sandbox Code Playgroud)

然后当用户选择另一行时,将该行保存到:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow],以便下次他可以看到他先前选择的行。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:indexPath.row] forKey:kPreviousSelectedRow];
}
Run Code Online (Sandbox Code Playgroud)

崩溃日志:索引为[[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue],计数为numberOfRows。如您所见,它不应该超出范围。我不知道[0 ... 6]的来源。

2013-08-23 21:01:26.107 [17605:c07] index:10, count:14
2013-08-23 21:01:26.173[17605:c07] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 7 beyond bounds [0 .. 6]'
Run Code Online (Sandbox Code Playgroud)

编辑:并且如果我缓慢滚动tableview,它不会崩溃,如果我快速滚动它,它就会崩溃。什么?

SVG*_*reg 2

你会崩溃,因为此时你没有具有指定索引的单元格,因为你只是在你的内部准备它- (UITableViewCell*)tableView:cellForRowAtIndexPath:

为了获得您期望的行为,请将其移出selectRowAtIndexPath:并将- (UITableViewCell*)tableView:cellForRowAtIndexPath:其放置在您正在更新UITableView:-(void)viewDidLoad或您调用-(void)reloadTable的另一个方法中