簡體   English   中英

覆蓋UITableViewController子類中的loadView

[英]overriding loadView in a UITableViewController subclass

我正在嘗試設置一個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).'

事實證明我需要將tableView的dataSource和delegate設置為加載的一部分。 所以當我這樣做時,一切正常:

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

威廉的回答也幫助我解決了最后一道障礙。

要添加一個快速示例,我通常使用的模式是:

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM