Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 重写UITableViewController子类中的loadView_Iphone_Uitableview_Loadview - Fatal编程技术网

Iphone 重写UITableViewController子类中的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

我正在尝试设置UITableViewController,使其tableView属于我的自定义子类。我的loadView方法当前如下所示:

- (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方法
编辑:崩溃如下所示。它发生在用户进行一些输入之后。如果我创建一个普通的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;
}

威廉的回答也帮助我跨过了最后一关

要添加一个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中。