переопределение loadView в подклассе UITableViewController - PullRequest
6 голосов
/ 08 сентября 2011

Я пытаюсь настроить UITableViewController так, чтобы его tableView принадлежал моему пользовательскому подклассу. Мой метод loadView в настоящее время выглядит так:

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

Я получаю сбои позже, когда я закомментирую вышеупомянутый метод. Так что чего-то не хватает. Но что?

В документации Apple написано Я не должен вызывать super в loadView. Это имеет смысл, потому что я хочу, чтобы у представления были мои классы, а не их.

То, что я пробовал, не помогает:

  • Перепишите метод loadView, чтобы он создавал простой UITableView. Это говорит мне, что источник проблемы не в реализации моего подкласса.
  • Вызовите [super viewDidLoad] из моего метода loadView. Из документации 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).'

Ответы [ 2 ]

12 голосов
/ 08 сентября 2011

Оказывается, мне нужно установить dataSource и делегировать моего tableView как часть загрузки. Поэтому, когда я делаю это, все работает нормально:

- (void) loadView {
   MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease];
   tv.dataSource = self;
   tv.delegate = self;
   self.view = tv;
   self.tableView = tv;
}
2 голосов
/ 20 августа 2015

Ответ Уильяма поможет и мне преодолеть последнее препятствие.

Чтобы добавить быстрый пример, я обычно использую шаблон:

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 в других местах ViewController.

...