dequeueReusableCellWithIdentifier索引超出范围

时间:2015-05-30 11:01:48

标签: ios uitableview swift

=> Demo Project @ GitHub <=

我的UITableViewController有一个TableView,其中我有一个Cell,其中有另一个TableView

当内部TableView为indexPath dequeueReusableCellWithIdentifier尝试(1,0)时,该应用程序崩溃

Terminating app due to uncaught exception 'NSRangeException', 
reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

虽然内部TableView显然有3个部分。堆栈跟踪是:

-[__NSArrayI objectAtIndex:] + 190
-[UITableViewDataSource tableView:indentationLevelForRowAtIndexPath:] + 61
-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke + 1711
+[UIView(Animation) performWithoutAnimation:] + 65
-[UITableView _configureCellForDisplay:forIndexPath:] + 312
-[UITableView dequeueReusableCellWithIdentifier:forIndexPath:] + 271

由于跟踪,我尝试实施

override func tableView(tableView: UITableView, 
              indentationLevelForRowAtIndexPath indexPath: NSIndexPath) -> Int {
  return 0
}

然后应用程序在

崩溃
-[UITableViewDataSource tableView:viewForFooterInSection:]

使用相同的index 1 beyond bounds [0 .. 0] ...

实施相对无关IMHO,但它是

override func tableView(tableView: UITableView, 
              cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  if tableView.tag == 0 {
    return super.tableView(tableView, cellForRowAtIndexPath: indexPath)
  }
  if let cell = tableView.dequeueReusableCellWithIdentifier("cell") as? UITableViewCell {
    return cell
  }
  return UITableViewCell() // Shouldn't happen.
}

我不是为最后一行感到超级自豪:)但你还有什么可以取悦编译器的呢?我从来没有达到那条线。崩溃显然发生在TableViewtag的内部_context.Database.SqlQuery<MyModel> ("[dbo].[myProc] @myParam1, @myParam2 " ,fromDateParameter, toDateParameter).ToList();

3 个答案:

答案 0 :(得分:1)

问题是对

的调用
super.tableView(tableView, cellForRowAtIndexPath: indexPath)

MasterViewControllerUITableViewController的子类,因此您正在调用基类cellForRowAtIndexPath的{​​{1}}。我认为理解你的代码的意图(&#34;嘿,我希望孩子UITableViewController在适当的情况下调用父级&#34;),但是你正在将类层次结构与视图层次结构混为一谈。这不是达到你想要的方式。

相反,你可以这样做:

cellForRowAtIndexPath

这会为override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if tableView.tag == 0 { return tableView.dequeueReusableCellWithIdentifier("ParentCell", forIndexPath: indexPath) as! UITableViewCell } return tableView.dequeueReusableCellWithIdentifier("ChildCell", forIndexPath: indexPath) as! UITableViewCell } 的{​​{1}}实例化一个单元格类型,为tag实例化另一个单元格类型。请注意,我已更改故事板以使两个表格视图都使用动态原型,并且我已更改了两个表格视图的标识符,如上所示。

坦率地说,我认为让一个对象尝试充当两种不同类型的表视图的委托是错误的。如果你真的有一个视图控制器和两个表视图,我认为为每个表视图实现自定义委托对象要更清晰,根据需要实例化它们,设置01适当的表视图。这样,您就可以避免使用&#34来丢弃所有委托方法;如果表0执行 x ,则执行 y &#34;逻辑。

但是,更广泛地说,我建议反对tableview中的表格视图。

答案 1 :(得分:0)

我想我知道答案。基本上,我知道在另一个内部使用TableView并不是一个非常聪明的想法,第一个是静态,另一个是Dynamic(我应该说明)。

然后我记得你一实施任何代表(例如cellForRow),你就需要全部实施......

为了实现目标,我只想使用1个TableView并使用TableViewHeader,这就是我要做的以及人们应该做什么,如果他们开始看到那些奇怪的消息。< / p>

答案 2 :(得分:-1)

你的第二个if语句应该包含在第一个语句中(如果tableView.tag == 0)。现在,它被调用两个tableViews,因此错误。