覆盖UITableViewController子类中的loadView

时间:2011-09-08 16:22:06

标签: iphone uitableview loadview

我正在尝试设置一个UITableViewController,以便它的tableView属于我的自定义子类。我的loadView方法目前看起来像这样:

- (void) loadView {
   MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease];
   self.view = tv;
   self.tableView = tv;
}

如果我评论出上述方法,我会在之后发生崩溃。所以缺少一些东西。但是什么?

Apple的文档says我不应该在loadView中调用super。这是有道理的,因为我希望视图有我的课,而不是他们的。

我尝试过的东西没有帮助:

  • 重写loadView方法,以便创建一个简单的UITableView。这告诉我问题的根源不在于我的子类的实现。
  • 从我的loadView方法调用[super viewDidLoad]。从Apple的文档中,我不清楚该方法是从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).'

2 个答案:

答案 0 :(得分:12)

原来我需要将tableView的dataSource和delegate设置为加载的一部分。因此,当我这样做时,一切正常:

- (void) loadView {
   MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease];
   tv.dataSource = self;
   tv.delegate = self;
   self.view = tv;
   self.tableView = tv;
}

答案 1 :(得分:2)

威廉的回答也帮助我解决了最后一道障碍。

要添加一个快速示例,我通常使用的模式是:

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。