Панель вкладок и Nav Controller: Где я ошибся в проводке Interface Builder? - PullRequest
0 голосов
/ 03 мая 2010

Я работал над приложением для iPhone в XCode и Интерфейсном Разработчике типа проекта Панель вкладок. После того, как все таблицы (бизнес-секторы) работали нормально, я понял, что мне нужно добавить элемент управления навигацией, чтобы пользователь мог детализировать таблицу подрубрик (подсекторов).

Как зеленый разработчик Objective-C, это сбивало с толку, но мне удалось заставить его работать, прочитав различную документацию, опробовав несколько различных вариантов IB. Моя текущая настройка - это контроллер панели вкладок с вкладкой 1 в качестве контроллера навигации и вкладкой 2 в виде простого представления с помещенным в него представлением таблицы. Проводка работает: я могу войти, когда строки таблицы выбраны, и я готов поместить новый View Controller в стек, чтобы я мог отобразить подтемы Table View.

Моя проблема: по какой-то причине табличное представление первой вкладки является делегатом и источником данных второй вкладки. Это не имеет смысла для меня, и я не могу понять, почему это единственная установка, которая работает. У меня другие проблемы, которые, как мне кажется, вызваны тупой проводкой.

альтернативный текст http://i43.tinypic.com/30nap85.jpg

Вот проводка:

  • Контроллер навигации (Секторы) является делегат Tab Bar
    • Панель навигации делегат навигационного контроллера (секторы)
    • Представление Contoller (Sectors) имеет представление о представлении таблицы
    • Вид таблицы (в навигации Контролер (Секторы)) является делегатом первого контроллера взгляда (Компании)
    • Вид таблицы (в навигации Контроллер (Секторы) является источником данных First View Controller (Компании)
  • First View Controller (компании)
    • Первый вид Contoller (Sectors) имеет вид табличного представления
    • Табличное представление (в контроллере первого вида (компании)) не подключено к выходу источника данных и не является делегатом

Когда я нажимаю кнопки вкладок и смотрю на Инспектора, я вижу, что первая вкладка правильно подключена к моему MainWindow.xib, а вторая выбрала перо с именем SecondView.xib. Он находится в владельце файла MainWindow.xib, где я наследую UITableViewDataSource и UITableViewDelegate (а также UITabBarControllerDelegate) в .h, и в .m, где я реализую методы делегата.

Почему эта настройка работает только тогда, когда табличное представление на моей первой вкладке (View Controller (Sectors)) является делегатом и источником данных второй вкладки? Я в замешательстве: почему его не нужно подключать к вкладке с включенным контроллером навигации, в которой отображается табличное представление (контроллер навигации (секторы))? Представление таблицы на второй вкладке не имеет ни источника данных, ни участника.

альтернативный текст http://i40.tinypic.com/15ri1ig.jpg альтернативный текст http://i44.tinypic.com/2dwete9.jpg

У меня проблемы с запуском pushViewController (self.navigationController не равен nil, но новый View Controller по-прежнему не загружается), и я подозреваю, что мне нужно решить эту проблему, прежде чем я смогу выяснить, почему Nav Controller не будет помещать новый View Controller в стек.

if(nil == self.navigationController) {
    NSLog(@"self.navigationController is nil.");
} else {
    NSLog(@"self.navigationController is not nil.");
    SectorList *subsectorViewController = [[SectorList alloc] initWithNibName:@"SectorList" bundle:nil];
    subsectorViewController.title = @"Subsectors";
    [[self navigationController] pushViewController:subsectorViewController animated:YES];
    [subsectorViewController release];
}

1 Ответ

0 голосов
/ 03 мая 2010

Первое, что бросается в глаза, это то, что контроллер представления для вашей вкладки Sectors - это UIViewController, а не UITableViewController. Вы должны просто удалить весь контроллер представления и перетащить UITableViewController из вашей библиотеки в IB и поместить его в свой UINavigationController. Он будет иметь UITableView, уже подключенный как его представление, с UITableViewController, уже установленным как dataSource, и делегировать для этого tableView.

После того, как в вашей NIB есть UITableViewController, вы должны изменить его имя класса в инспекторе на имя подкласса UITableViewController, который вы реализовали в коде.

Еще одна вещь: у вас есть отношения dataSource и делегата в обратном направлении, когда вы заявляете, что ваше табличное представление «является источником данных», а «является делегатом». Просто чтобы уточнить:

  • tableView имеет свойство dataSource, которое указывает на объект, который реализует протокол UITableViewDataSource (обычно это экземпляр подкласса UITableViewController).
  • tableView имеет свойство делегата, которое указывает на объект, который реализует протокол UITableViewDelegate (обычно тот же экземпляр подкласса UITableViewController).
  • Класс UITableViewController реализует протоколы UITableViewDataSource и UITableViewDelegate. При правильной настройке пользовательский подкласс UITableViewController является источником данных и делегатом его tableView.
...