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