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

Добавляем UINavigationController в существующий проект

Как вы заметили с предыдущих уроков, UINavigationController — это хорошая и полезная штука, которая облегчает жизнь программиста в процессе реализации переходов меджу представлениями. Но что делать в ситуации, если при создании проекта вы не планировали использовать контроллер навигации (создали его на основе представления View-based Application). А в процессе развития проекта поняли, что без контроллера навигации не обойтись… В таком случае вы можете его добавить самостоятельно. И сейчас я покажу как это делать.

Для начала создадим проект, в котором по умолчанию контроллер навигации отсутствует, к примеру, на основе представления (View-based Application). Я свой проект назвали addNaviController. Чтобы в конце убедится, что у нас все правильно работает — добавьте надпись на *.xib-файл класса addNaviControllerViewController. Текст надписи не имеет значения.

Контроллер навигации у нас будет один на все приложение, поэтому добавлять мы его будем в AppDelegate. Откройте интерфейс класса addNaviControllerAppDelegate и строчку

<code data-result="[object Object]">@property (nonatomic, retain) IBOutlet addNaviControllerViewController *viewController;</code>

 

Приведите к виду:

<code data-result="[object Object]">@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;</code>

 

А строчку @class addNaviControllerViewController; удалите вообще.

Теперь изменим код в реализации этого же класса. То, что выглядело вот так:

<code data-result="[object Object]">#import "addNaviControllerAppDelegate.h"

#import "addNaviControllerViewController.h"

@implementation addNaviControllerAppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}</code>

Теперь должен иметь такой вид:

<code data-result="[object Object]">#import "addNaviControllerAppDelegate.h"

@implementation addNaviControllerAppDelegate

@synthesize window = _window;
@synthesize navigationController = _navigationController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}</code>

И конечно же не забудьте изменить метод dealloc:

 

<code data-result="[object Object]">- (void)dealloc
{
    [_window release];
    [_navigationController release];
    [super dealloc];
}</code>

На этом работа с кодом закончена. Теперь перейдите к файлу MainWindow.xib. Среди объектов этого файла вы увидите Add Navi Controller View Controller. Можете смело его удалять. На картинке этот объект обведен красной линией.

 


После удаления откройте панель утелит, в библиотеке объектов найдите Navigation Controller и перетяните его в список объектов файлаMainWindow.xib на место только что удаленного Add Navi Controller View Controller.

 

Раскройте список объектов Navigation Controller и найдите там View Controller — Root View Controller.

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

Поскольку контроллер представления у нас только один — его мы и укажем. Для этого выберите объект View Controller — Root View Controller и перейдите на вкладку инспектора идентификации панели утилит.

В поле Class укажите имя класса нашего контроллера навигации (addNaviControllerViewController). Здесь же, на вкладке инспектора атрибутов укажите имя *.xib-файла, который будет загружаться при старте приложения (в нашем случае это имя совпадает с именем класс, поэтому, указываем то же самое). Обратите внимание на то, что расширение файлов указывать не нужно, то есть писать не addNaviControllerViewController.h или addNaviControllerViewController.xib, а просто addNaviControllerViewController.

Осталось связать код с интерфейсом. Мы это делали много раз, поэтому думаю, что ничего нового я сейчас не расскажу. В списке объектов файла MainWindow.xib правой кнопкой нажмите на объект addNaviController App Delegate. В открывшемся окошке найдите поле с надписью navigationController. Напротив этого поля будет кружек, подведите к нему курсор мышки и вы увидите, что в кружке появился знак плюс. Теперь нажмите левую кнопку мышки, не отпуская подведите к объекту Navigation Controller. Когда объект Navigation Controller будет обведен синей рамкой отпустите мышку.

Вот и все. Этих нескольких операций вполне достаточно, чтобы добавить в проект  UINavigationControllerв.

 

В случае, если вы создали проект без xib-файла — ваш метод didFinishLaunchingWithOptions будет выглядеть примерно так:

 

<code data-result="[object Object]">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}</code>

 

Его следует изменить следющим образом (при этом, не забудьте изменить в интерфейсе и методах доступа контроллер представления на контроллер навигации, как мы это сделали в самом начале варианта с xib-файлом):

 

<code data-result="[object Object]">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    ViewController *viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    self.navigationController = [[[UINavigationController alloc] initWithRootViewController:viewController] autorelease];

    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}</code>

 

Теперь проект без интерфейса должен работать так же, как с ним.