Iphone 我在cellForRowAtIndexpath中添加了selectRowAtIndexPath以标记上一个选定行,但如果滚动表格查看,它将崩溃
我正在制作一个自定义UITableView菜单选择器组件。每次我选择一个特定的行时,我都会保存这一行的indexpath,这样当用户下次选择另一行时,人们就可以知道他以前选择的行。所以我把它添加到CellForRowatineXpath中Iphone 我在cellForRowAtIndexpath中添加了selectRowAtIndexPath以标记上一个选定行,但如果滚动表格查看,它将崩溃,iphone,ios,uitableview,Iphone,Ios,Uitableview,我正在制作一个自定义UITableView菜单选择器组件。每次我选择一个特定的行时,我都会保存这一行的indexpath,这样当用户下次选择另一行时,人们就可以知道他以前选择的行。所以我把它添加到CellForRowatineXpath中 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cell
- (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]'
编辑:如果我慢慢滚动tableview,它不会崩溃,如果我快速滚动,它会崩溃。什么
[tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];
不应位于单元格内,如箭头所示
从用户每次选择单元格时都会触发的didSelectRowAtIndexPath
获取您的indexath
。
如果要在用户取消选择单元格或选择其他单元格时触发其他方法,请使用
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
发生崩溃是因为此时没有具有指定索引的单元格,因为您只是在-(UITableViewCell*)表中准备它。视图:cellForRowAtIndexPath:
要获取您期望的行为,请从-(UITableViewCell*)表视图:cellforrowatinexpath:
中选择rowatinexpath:
并将其放置在另一个方法中,在该方法中更新UITableView
:-(void)viewDidLoad
或调用-(void)的位置重载表
例如您可以创建一个容量等于行数的数组。可能会使用没有BOOL值的数组填充它(实际上[NSnumber numberWithBool:],因为它们需要是对象)
然后在
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
更改位于indexPath.row位置的对象的值
而且
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
检查数组中的布尔值是否设置为“是”,然后选择单元格。(cell.selected=YES)
你可以做一个具有自定义选择样式的自定义单元格或其他东西,并在单元格上创建一个方法,应用你选择的设计并在cellForRowAtIndexPath中调用该方法。哦,我只是将SelectRowatinex替换为layoutsubview,现在它不会崩溃。谢谢SVGreg的提示。你的应用程序正在崩溃use it尝试选择当前可能不可见的行。当数据可能尚未完全可用时,您尝试在数据源方法“CellForRowatineXpath”中选择行。这就是出现越界错误的原因 对于您的特定示例,您可以在更新值之前尝试选择“didSelectRowAtIndexPath”中以前选择的行,因为您的数据已经显示,所以不会在此处崩溃
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:indexPath.row] forKey:kPreviousSelectedRow];
}
SVGreg是对的。您应该在另一个方法中使用单元格。但viewDidLoad不是最佳选项。您可以尝试这种有用的委托方法
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
}
用户每次在屏幕上滚动新单元格时,都会调用CellForRowatineXpath。您真的想在这里选择单元格吗?我没有其他选项了。它是UIView的子类。但它是UIView的子类,没有viewdidload。请找一个您已经加载/更新表的位置。抱歉,我没有看到您的whole文件能够帮助您不,不是我在cellForRow中选择row,我只使用SelectRowatineXpath来标记上一个选中的行,这样用户就可以知道他以前选择的选项。然后如果用户想选择另一行,我在DidSelectRowatineXpath中实现它。标记用户上一个选中行的更好方法是什么。这很奇怪,我使用了完全相同的代码。是否要选择两行?是否设置了multiselection?是否在任何其他点取消选择该行?此外,在调用SelectRowatineXpath之前,请确保设置了NSUserDefaults。您可能希望将其包装在if语句中。