ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

10. UINavigationController

Контроллер навигаций (UINavigationController)

В первом знакомстве с таблицами я задевал тему UINavigationController, но саму работу этого класса мы не рассматривали. Я думаю, что пришло время поправить эту ситуацию.

 

 

UINavigationController обеспечиваюет навигацию и анимированные переходы между контроллерами представлений (чаще всего с таблицами, контроллер навигации обеспечивает переход от краткого отображения данных в таблице к детальному представлению элемента). Для начала я предлагаю не создавать новый проект и не добавлять самостоятельно в него контролер навигации, а использовать готовый шаблон, который содержит Xcode (Navigation-Based Application). А лучше готовый проект, который содержит контроллер навигации. Такой проект мы создавали в примере Самая простая таблица (UITableView), его исходный код можно скачатьздесь.

 

В этом примере у нас уже имеется контроллер навигации и один контроллер представления. Давайте добавим в него еще один контроллер представления, в котором будем отображать детальную информацию. Для этого в папке проекта нажмите правой кнопкой на папку TableView и выберите в появившемся всплывающем меню пункт New File…

 

 

Перед вами откроется окно добавления нового файла. В левой части этого окна выберите пункт Cocoa Touch, а в правой —UIViewController subclass и нажмите кнопку Next.

 

 

В следующем окне в меню Subclass of выберите UIViewController и не забудьте поставить галочку возле пункта With XIB for user interface (наше представление будет создано с nib-файлом). Теперь снова нажмите кнопку Next.

 

 

В следующем окне в поле Save As укажите имя класса (я назвал его MyClassViewController) и нажмите кнопку Save.

 

 

Как известно, указание в имени объекта его типа считается плохим тоном, но не в этом случае. Когда у нас в одном проекте будет много файлов — для просмотра типа каждого такого объекта будет уходить много времени поэтому тип класса мы указываем в имени.

 

Для отображения детальной информации добавим к нашему только что созданному класса два объекта name и selectedStudent с типом UILabel и NSString соответственно (selectedStudent будет принимать значение выбранной ячейки, а с помощью name мы будем отображать это значение на экране). Чтобы только что созданные объекты моги принимать значения от других классов следует добавить для них свойства и синтезировать методы доступа (так же не забывайте о очистке памяти в методе dealloc). Свяжем обект name с интерфейсом. Как это делать я уже описывал в Знакомство с GUI, а так же в самом первом примере Создание первого приложения Hello world. В методе viewDidLoad присвоим объекту name значение выбранной ячейки:

 

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];
    name.text = selectedStudent;
}</code>

 

Теперь перейдем к контроллеру таблицы (RootViewController). В первую очередь следует импортировать наш новый класс. Я сделал это в реализации класса RootViewController после импорта его интерфейса. То есть, в файле RootViewController.m после строки #import «RootViewController.h» я добавил строку #import «MyClassViewController.h».

 

Переход к детальному представлению информации будет выполнятся в момент нажатия на ячейку таблицы. Как я уже говорил, при нажатии на ячейку срабатывает метод didSelectRowAtIndexPath, он уже имеет некоторый код. Этот код являет примером использования контроллера навигации. Давайте изменим его под наши требования:

 

<code data-result="[object Object]">- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyClassViewController *detailViewController = [[MyClassViewController alloc] 
                                                   initWithNibName:@"MyClassViewController" bundle:nil];
    detailViewController.selectedStudent = [students objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}</code>

 

Таким образом, в момент нажатия на ячейку мы создаем экземпляр класса MyClassViewController, затем атрибуту этого класса selectedStudent мы присваиваем значение выбранной ячейки. После того как значение установлено — мы говорим нашему контроллеру перейти к только что созданному контроллеру представления. И в конце освобождаем память от только что созданного объекта.

 

В этом примере я продемонстрировал основные возможности класса UINavigationController, в следующем примере я научу вас изменять тип анимации при переходе между контроллерами представления. А исходный код этого проекта можно скачать здесь.