Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 我在cellForRowAtIndexpath中添加了selectRowAtIndexPath以标记上一个选定行,但如果滚动表格查看,它将崩溃_Iphone_Ios_Uitableview - Fatal编程技术网

Iphone 我在cellForRowAtIndexpath中添加了selectRowAtIndexPath以标记上一个选定行,但如果滚动表格查看,它将崩溃

Iphone 我在cellForRowAtIndexpath中添加了selectRowAtIndexPath以标记上一个选定行,但如果滚动表格查看,它将崩溃,iphone,ios,uitableview,Iphone,Ios,Uitableview,我正在制作一个自定义UITableView菜单选择器组件。每次我选择一个特定的行时,我都会保存这一行的indexpath,这样当用户下次选择另一行时,人们就可以知道他以前选择的行。所以我把它添加到CellForRowatineXpath中 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cell

我正在制作一个自定义UITableView菜单选择器组件。每次我选择一个特定的行时,我都会保存这一行的indexpath,这样当用户下次选择另一行时,人们就可以知道他以前选择的行。所以我把它添加到CellForRowatineXpath中

- (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语句中。