我试图设置一个UITableViewController,使其tableView属于我的自定义子类。我的loadView方法现在看起来像这样:
- (void) loadView {
MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease];
self.view = tv;
self.tableView = tv;
}
如果我注释掉上面的方法,稍后我就会崩溃。所以少了一些东西。但是什么?
Apple的文档说我不应该在loadView中调用super。这是有道理的,因为我希望视图有我的类,而不是他们的。我试过但没有用的事:
- 重写loadView方法,使它创建一个普通的UITableView。这告诉我,问题的根源不在于我的子类的实现。从我的loadView方法调用[super viewDidLoad]。从苹果的文档中,我不清楚那个方法是从loadView还是之后调用的。在任何情况下,将它添加到loadView方法的末尾都没有帮助。
我尝试过的一种方法确实解决了这个问题,但违背了目的:
- 注释掉我的loadView方法。
编辑:崩溃显示如下。它发生在用户完成一些输入之后。如果我创建一个普通的UITableView而不是我的子类,它也会以同样的方式发生。应用程序中发生了很多事情,我的loadView重写中的某些东西[或者更可能的是,我的重写中缺少的某些东西]导致状态不同,这反过来导致崩溃。但我不知道有什么好方法可以追踪不同之处。
2011-09-08 12:44:59.591 MyAppName[97649:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[MyTableViewSubclass scrollToRowAtIndexPath:atScrollPosition:animated:]: row (0) beyond bounds (0) for section (0).'
我需要设置我的tableView的数据源和委托作为加载的一部分。当我这样做的时候,一切正常:
- (void) loadView {
MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease];
tv.dataSource = self;
tv.delegate = self;
self.view = tv;
self.tableView = tv;
}
William的回答也帮助我跨过了最后的障碍。
要添加一个swift示例,我通常使用的模式是:class SomeTableViewController: UITableViewController {
private var childView: SomeTableView! { return tableView as! SomeTableView }
override func loadView() {
tableView = SomeTableView(frame: UIScreen.mainScreen().bounds, style: .Plain)
tableView.delegate = self
tableView.dataSource = self
view = tableView
}
}
然后你可以自由地在ViewController的其他地方引用自定义视图作为childView。