在我的应用程序中,我有一个动态行数UITableView
。用户单击单元格后,应用程序将导航到另一个UIView
,用户可以单击后退按钮转到UITableView
。回去时我想突出显示所选单元格并将单元格滚动到中心。这就是我实现它的方式
-(void) tableView:(UITableView *)tableView
willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath {
if (!isScrollerSet && self.selectedRowNo!=-1) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.selectedRowNo
inSection:0];
[self.tableViewP selectRowAtIndexPath:indexPath
animated:YES
scrollPosition:UITableViewScrollPositionMiddle];
isScrollerSet = YES;
}
}
当用户返回时,将再次显示行时调用此方法。我在didSelectRowAtIndexPath:
方法中设置了正确的行号。
当UITableView
行数较少时,这可以正常工作。让我们说UITableVIew
有100行,用户点击了第90行。当他回来时,应用程序在调用didSelectRowAtIndexPath:
方法时崩溃了。例外情况如下
*** Terminating app due to uncaught exception 'NSRangeException',
reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds
for empty array'
然后我将此代码移至viewDidAppear:
。现在它与任意数量的行有关。我无法弄清楚为什么会这样。有人可以解释是什么原因吗?
答案 0 :(得分:0)
假设您没有有缺陷的代码,可能是:
-(void) tableView:(UITableView *)tableView
willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
在Datasource
初始化之前调用。例如,如果您在UITableView
函数中实例化UIViewController's viewDidLoad
,然后在之后初始化Datasource
,那么在重新加载UITableView
后,您将获得零值。
虽然viewDidAppear
在运行时中发生的时间早于viewDidLoad
,所以此时Datasource
有效且您可以在NSArray
中引用该索引。如果这是您的例外原因,那么您可以通过在Datasource
的最开始进行viewDidLoad
初始化来解决此问题。
根据您提供的信息,这是我最好的猜测。您可能希望在问题中提供更多详细信息。
答案 1 :(得分:0)
所以解决方法是你可以设置一个整数或任何其他变量并在cellforRowAtindexpath中检查它。当你返回..(更好地在UserDafault中存储价值)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
if(indexpath.row==<your value>)
{
// your code.
}
....
}