Добавление TTTableViewController (из three20) в другой UIViewController

У меня проблема с 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 полностью указал мне на правильное решение. Он был прав в том, что это потому, что viewWillAppear: и viewDidAppear: TTTableViewController не получили ответа. Я проверил это, создав подкласс 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: не будут вызваны дважды), но я готов с этим покончить.


person donkim    schedule 17.02.2011    source источник
comment
Решение работает! Если есть лучшее решение, это будет здорово .. Сохранять каждый контроллер и вызывать viewWillAppear слишком сложно при использовании большого количества контроллеров tt.   -  person samwize    schedule 25.02.2011


Ответы (2)


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

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

person Di Wu    schedule 17.02.2011
comment
Спасибо за подсказку. Это определенно дало мне возможность исследовать. Думаю, я скоро узнаю больше о UIViewControllers ... :) - person donkim; 17.02.2011
comment
На самом деле ... Только что понял, что мой образец для его работы делает в основном то же самое ... Он добавляет view к другому UIView, не загружая TTTableViewController модально. Хммм .. Но в любом случае, спасибо, что заставил меня задуматься в этом направлении. :) - person donkim; 17.02.2011
comment
Я остановился на решении, которое мне не кажется таким уж чистым, как вы можете видеть в моих обновлениях. Еще раз спасибо, что указали мне в этом направлении. - person donkim; 17.02.2011

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

Просто вызовите экземпляр TTTableViewController;

Например:

  TTTableViewController tableViewController;
  [tableViewController createModel]

и

  [tableViewController updateView]

в viewDidLoad.

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

person jetmc    schedule 15.05.2012