2011-09-08 58 views
6

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

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

如果我注释掉上述方法,那么随后会崩溃。所以缺少一些东西。但是什么?

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

事情我已经试过,不帮助:

    ,这样它正在创建一个普通的UITableView
  • 重写的loadView方法。这告诉我,问题的根源并不在于我的子类的实现。
  • 从我的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).' 
+0

你能告诉我们崩溃日志说什么吗? - 感谢 – Madhu

+0

您可以从崩溃中添加控制台输出吗? – chown

回答

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; 
} 
+0

+1的autorelease部分!很重要。 –

+0

我有一个问题。这种方法不会破坏MVC的目的吗?因为现在控制器只能使用一种类型的表格,除非您再次控制控制器并重载loadView? –

+0

在MVC的问题上,ViewController现在可能与View相关联,但它更适合MVC模型,将Controller与View分开。查看ViewController中的View,Controller代码中的代码。没有像这样的分离,你将所有的代码转储到一个ViewController中。 – AgentK

1

威廉的回答帮我过最后一关了。

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

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 
    } 

} 

你就可以自由是指在视图控制器等地自定义视图childView。