Iphone 重写UITableViewController子类中的loadView
我正在尝试设置UITableViewController,使其tableView属于我的自定义子类。我的loadView方法当前如下所示:Iphone 重写UITableViewController子类中的loadView,iphone,uitableview,loadview,Iphone,Uitableview,Loadview,我正在尝试设置UITableViewController,使其tableView属于我的自定义子类。我的loadView方法当前如下所示: - (void) loadView { MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease]; self.view = tv; self.tableV
- (void) loadView {
MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease];
self.view = tv;
self.tableView = tv;
}
如果我对上述方法进行注释,我会在以后的过程中遇到崩溃。所以有些东西不见了。但是什么呢
苹果的文档我不应该在loadView中调用super。这是有道理的,因为我想要的是我的课,而不是他们的课
我尝试过但没有帮助的事情:
- 重写loadView方法,使其创建普通UITableView。这告诉我问题的根源不在于我的子类的实现
- 从我的loadView方法调用[super viewDidLoad]。从苹果的文档来看,我不清楚这个方法是从loadView调用的还是在loadView之后调用的。在任何情况下,将其添加到我的loadView方法的末尾都没有帮助
- 注释掉我的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;
}
威廉的回答也帮助我跨过了最后一关 要添加一个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。您能告诉我们崩溃日志中的内容吗-谢谢你能添加崩溃时的控制台输出吗?我有个问题。这种方法不是违背了MVC的目的吗?因为现在控制器只能处理一种类型的表,除非您再次对控制器进行子类化并重写loadView?关于MVC的问题,ViewController现在可能与视图绑定,但通过将控制器与视图分离,它更适合MVC模型。视图中的视图代码,视图控制器中的控制器代码。如果没有这样的分离,您将把所有代码转储到一个ViewController中。