6

我正在尝试设置一个 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]。从 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).'
4

2 回答 2

12

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

- (void) loadView {
   MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease];
   tv.dataSource = self;
   tv.delegate = self;
   self.view = tv;
   self.tableView = tv;
}
于 2011-09-08T18:04:59.610 回答
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。

于 2015-08-19T23:49:18.823 回答