Добавление TTTableViewController (из трех20) в другой UIViewController - PullRequest
5 голосов
/ 17 февраля 2011

У меня проблема с three20, я надеюсь, что кто-нибудь сможет мне помочь.

У меня есть TTTableViewController, который я использую очень похоже на то, как приложение TTTwitter в примерах проектов three20 использует его. У меня есть только три метода, которые я реализую: (id)init, (void)createModel и (id<UITableViewDelegate>)createDelegate. И я подклассами TTListDataSource и TTURLRequestModel для моих данных. Подводя итог, это довольно простое использование TTTableViewController, я не делаю ничего необычного.

Когда я добавляю TTTableViewController к потомку UIView, он работает просто отлично. Он загружает и отображает данные отлично. Например, следующие два работают нормально:

FooTableViewController *controller = [[FooTableViewController alloc] init];
controller.view.frame = CGRectMake(288, 20, 480, 1004);
[self.window addSubview:controller.view];

Как это сделать:

FooTableViewController *controller = [[FooTableViewController alloc] init];
controller.view.frame = CGRectMake(288, 20, 480, 1004);

UIScrollView *scrollView = [[UIScrollView alloc] init];
scrollView.frame = CGRectMake(0, 0, 768, 1024);
// a bunch of scrollView variable initializations..
[scrollView addSubview:controller.view];
[self.window addSubview:scrollView];

Проблема возникает, когда я пытаюсь добавить FooTableViewController (который, опять же, является подклассом TTTableViewController) к view потомка UIViewController. Следующее, например, не работает:

FooTableViewController *controller = [[FooTableViewController alloc] init];
controller.view.frame = CGRectMake(288, 20, 480, 1004);

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.frame = CGRectMake(0, 20, 768, 1004);
[viewController.view addSubview:controller.view];

[self.window addSubview:viewController.view];

Есть идеи, почему это происходит? Как я уже сказал, он прекрасно работает, когда я добавляю его в UIView (то есть, который отсутствует в UIViewController), но не работает, когда я пытаюсь добавить его в UIViewController. Помимо попыток добавить его, как я делал выше, я также попытался создать подкласс UIViewController и добавить его изнутри. Не повезло.

Спасибо!

РЕДАКТИРОВАТЬ Я должен быть немного более ясным, что я имею в виду под "это не работает". Все, что я вижу, это пустая таблица - просто пустые строки. Установка точки останова на createModel действительно показывает, что этот метод не вызывается. Спасибо!

ОБНОВЛЕНИЕ diwup полностью указал мне на правильное решение. Он был прав, потому что TTTableViewController 1046 * и viewDidAppear: не вызывали. Я проверил это, создав подкласс UIViewController (я назвал его FooViewController) и добавив TTTableViewController к view из класса (я назвал TTTableViewController переменную controller). Я также отверг два метода как этот:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [controller viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [controller viewDidAppear:animated];
}

И, о чудо, это сработало! Конечно, это не долгосрочное решение, я все же хочу выяснить, как заставить viewWillAppear: и viewDidAppear: вызываться отдельно.

UPDATE2 Я решил просто переопределить viewDidLoad: примерно так:

- (void)viewDidLoad {
    [super viewDidLoad];

    [super viewWillAppear:NO];
    [super viewDidAppear:NO];
}

Я не слишком доволен этим, это кажется хакерским (и я, вероятно, должен удостовериться, что viewWillAppear: и viewDidAppear: не будут вызваны дважды), но я готов позвонить ему через день.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2011

Мой ответ может быть не актуален.Но я подозреваю, что проблема может быть связана с методом addSubview: .Поскольку addSubview: не гарантирует, что представление находится на верхнем уровне иерархии представлений, некоторые методы этого представления могут не запускаться во время или после addSubview: .Эти методы включают viewWillAppear: , viewDidAppear: и т. Д. И т. Д.

Следовательно, если код Three20 использует эти методы интерфейса, все может пойти не так.Я бы посоветовал вам попытаться представить этот контроллер модально и посмотреть, что произойдет.

1 голос
/ 15 мая 2012

Тот же вопрос.

Просто вызовите объект TTTableViewController;

например:

  TTTableViewController tableViewController;
  [tableViewController createModel]

и

  [tableViewController updateView]

в viewDidLoad.

это работает.

...