我的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.
}
我不是为最后一行感到超级自豪:)但你还有什么可以取悦编译器的呢?我从来没有达到那条线。崩溃显然发生在TableView
为tag
的内部_context.Database.SqlQuery<MyModel>
("[dbo].[myProc] @myParam1, @myParam2 "
,fromDateParameter, toDateParameter).ToList();
。
答案 0 :(得分:1)
问题是对
的调用super.tableView(tableView, cellForRowAtIndexPath: indexPath)
但MasterViewController
是UITableViewController
的子类,因此您正在调用基类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
实例化另一个单元格类型。请注意,我已更改故事板以使两个表格视图都使用动态原型,并且我已更改了两个表格视图的标识符,如上所示。
坦率地说,我认为让一个对象尝试充当两种不同类型的表视图的委托是错误的。如果你真的有一个视图控制器和两个表视图,我认为为每个表视图实现自定义委托对象要更清晰,根据需要实例化它们,设置0
和1
适当的表视图。这样,您就可以避免使用&#34来丢弃所有委托方法;如果表0执行 x ,则执行 y &#34;逻辑。
但是,更广泛地说,我建议反对tableview中的表格视图。
答案 1 :(得分:0)
我想我知道答案。基本上,我知道在另一个内部使用TableView并不是一个非常聪明的想法,第一个是静态,另一个是Dynamic(我应该说明)。
然后我记得你一实施任何代表(例如cellForRow
),你就需要全部实施......
为了实现目标,我只想使用1个TableView并使用TableViewHeader
,这就是我要做的以及人们应该做什么,如果他们开始看到那些奇怪的消息。< / p>
答案 2 :(得分:-1)
你的第二个if语句应该包含在第一个语句中(如果tableView.tag == 0)。现在,它被调用两个tableViews,因此错误。