在UITableViewController子类中重写loadView



我试图设置一个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。

相关内容

  • 没有找到相关文章

最新更新