Это несколько затянуто, но я думаю, что лучше быть ясным.Я не могу найти окончательный способ сделать это, и проблема тонкая (я думаю).
У меня есть приложение, иерархия GUI которого выглядит примерно так:
- Основной список (имеет настраиваемую ячейку и высоту таблицы)
- Подсписок (для выбранного элемента Основного списка)
- Информация подсписка (для выбранного элемента Подсписка)
- Настройки (для выбранного элемента главного списка)
- Настройки Информация (для выбранного элемента настроек)
После выбора основного элемента списка пользователь может переключаться между подсписком и настройками, каждый из которыхкоторые имеют свою собственную иерархию GUI.Переключение выполняется с помощью панели инструментов.
Я пробовал несколько подходов, и, похоже, ничего не работает точно.
Первая попытка (вдохновленный другими вопросами здесь)
- UINavigationController
- UITableViewControllerBase (загружается из кончика)
- TableViewController1 (загружается программно в didSelectRowAtIndexPath)
- TableViewController2 (можно поменять местами из TableViewController1)
Я передаю ссылку на rootViewController при создании различных объектов,затем используйте это для переключения.
[rootViewController switchViews]
В rootViewController.switchViews ():
[TableViewController2 alloc] init];
[TableViewController1 removeFromSuperview];
[self.view insertSubview:TableViewController2.view atIndex:0]
. . .
По сути, rootViewController управляет переключателем.Это работает для коммутатора, но когда я возвращаюсь назад по иерархии к Основному списку, он не инициализирует ячейки таблицы должным образом.
В cellForRowAtIndexPath:
static NSString *CellId = @"CellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIDentifier:CellId];
if (cell == nil)
{
... (this does not get called)
}
, потому что кодв скобках не вызывается, табличное представление выглядит «универсальным», то есть пользовательская ячейка не используется.Хотя это может быть не связанной ошибкой, весь подход здесь не показался мне правильным.Насколько я понимаю, активный контроллер представления должен обрабатывать коммутатор.Поэтому я попробовал что-то другое.,.
Вторая попытка (по мотивам книги «Программирование для начинающих iPhone»):
- UINavigationController
- UITableViewControllerBase (загружается из пера)
- UIViewControllerParent (загружается программноon didSelectRowAtIndexPath)
- TableViewController1 (загружается программно в родительский loadView)
- TableViewController2 (может быть заменен из TableViewController1)
Здесь мы заключаем оба вложенных табличных представления в родительский контроллер и позволяем родительскому элементу выполнять всю работу.
В loadView () родительского объекта:
TableViewController1 *tvc1 = [[UITableViewController alloc] init];
self.tableViewController1 = tvc1;
[self.view insertSubview:tableViewController1.view atIndex:0];
[tvc1 release];
Проблема заключается в том, что tableViewController1, хотя и инициирован, не имеет действительного представления во время его вставки.Таким образом, функция loadView вызывается снова и снова.,,Я также попытался поместить этот код в viewDidLoad, та же проблема.
Я прочитал пример кода TheElements с сайта разработчика iOS и изначально собирался пойти по этому пути.Проблема в том, что после того, как пользователь переключает представления в моем приложении, появляется больше экранов, в которые он может углубиться.Я хочу, чтобы все эти экраны были частью иерархии приложения (чтобы мы могли вернуться к Основному списку, когда захотим).В то время как TheElements иллюстрирует переключение, оно просто переключает представления в одном UIViewController - мне нужно иметь возможность развернуть детали после перехода к новым экранам и сделать так, чтобы все эти экраны были частью иерархии UINavigationViewController, для целей навигации.
Я новичок во всем этом, так что возможно я думаю о вещах неправильно. Отсюда и вопрос. Я уверен, что этот дизайн несколько распространен, поэтому, хотя, несомненно, есть много способов сделать это, я ищу лучшую практику. Ключевым моментом здесь является то, что после того, как переключение выполнено, пользователь должен иметь возможность перемещаться дальше вниз по иерархии UINavigationViewController и иметь возможность перемещаться обратно вверх. Это требует загрузки нескольких UIViewControllers. Я верю.
Большое спасибо за время (и извинения за длинный пост).