カスタム 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;
}
ユーザーが別の行を選択したら、この行を :[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] に保存して、次回は以前に選択した行を表示できるようにします。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:indexPath.row] forKey:kPreviousSelectedRow];
}
クラッシュ ログ: インデックスは [[[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]'
EDITED:テーブルビューをゆっくりスクロールしてもクラッシュしません。速くスクロールするとクラッシュします。何?