>– (NSString *) reverseOfString:(NSString *)paramString{


>NSMutableString *reversed = [[NSMutableString alloc]

>initWithCapacity: paramString.length];


>for (NSInteger counter = paramString.length – 1;

>counter >= 0;

>counter—){

>[reversed appendFormat:@"%c", [paramString characterAtIndex: counter]];

>}


>return [reversed copy];


>}


>– (void) performActivity{


>NSMutableString *reversedStrings = [[NSMutableString alloc] init];


>for (NSString *string in self.activityItems){

>[reversedStrings appendString: [self reverseOfString: string]];

>[reversedStrings appendString:@"\n"];

>}


>UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Reversed"

>message: reversedStrings

>delegate: self

>cancelButtonTitle:@"OK"

>otherButtonTitles: nil];


>[alertView show];

>}


Итак, реализация класса нашей функции завершена. Перейдем к файлу реализации контроллера вида и отобразим контроллер вида функции в списке с нашей специальной функцией:


>#import "ViewController.h"

>#import "StringReverserActivity.h"


>@implementation ViewController


>– (void) viewDidAppear:(BOOL)animated{

>[super viewDidAppear: animated];


>NSArray *itemsToShare = @[

>@"Item 1",

>@"Item 2",

>@"Item 3",

>];


>UIActivityViewController *activity =

>[[UIActivityViewController alloc]

>initWithActivityItems: itemsToShare

>applicationActivities:@[[StringReverserActivity new]]];


>[self presentViewController: activity animated: YES completion: nil];

>}

>@end


При первом запуске приложения на экране появится картинка, примерно такая, как на рис. 1.30.


Рис. 1.30. Специальная функция для обращения строк теперь находится в списке доступных функций


Если теперь вы нажмете в этом списке элемент Reverse String (Обращенная строка), то увидите нечто похожее на рис. 1.31.


Рис. 1.31. Наша функция для обращения строк в действии

См. также

Раздел 1.10.

1.12. Внедрение навигации с помощью UINavigationController

Постановка задачи

Необходимо дать пользователю возможность переходить от одного контроллера вида к другому, сопровождая этот процесс плавной анимацией, интегрированной в программу.

Решение

Используйте экземпляр класса UINavigationController.

Обсуждение

Если вам доводилось работать с iPhone, iPod touch или iPad, то вы, скорее всего, уже видели в действии навигационный инструмент управления. Например, если перейти в приложение Settings (Настройки) телефона, там можно выбрать команду Wallpaper (Обои) (рис. 1.32). В таком случае вы увидите, как основной экран программы Settings (Настройки) отодвигается влево, а на его место справа выходит экран Wallpaper (Обои). В этом и заключается самая интересная черта навигации iPhone. Вы можете складывать контроллеры видов в стек и поднимать их из стека. Контроллер вида, в данный момент находящийся на верхней позиции стека, виден пользователю. Итак, только самый верхний контроллер вида показывается зрителю, а чтобы отобразить другой контроллер, нужно либо удалить с верхней позиции контроллер, видимый в настоящий момент, либо поместить на верхнюю позицию в стеке новый контроллер вида.


Рис. 1.32. Контроллер вида настроек, отодвигающий вид с обоями для экрана


Теперь добавим в новый проект навигационный контроллер. Но сначала нужно создать проект. Выполните шаги, описанные в разделе 1.9, чтобы создать пустое приложение с простым контроллером вида. Данный раздел – расширенная версия работы, выполненной в разделе 1.9. Начнем с файла реализации (.m) делегата нашего приложения:


>#import "AppDelegate.h"

>#import "FirstViewController.h"


>@interface AppDelegate ()

>@property (nonatomic, strong) UINavigationController *navigationController;

>@end


>@implementation AppDelegate

>…


Теперь следует инициализировать навигационный контроллер, воспользовавшись его методом initWithRootViewController:, и передать корневой контроллер нашего вида как параметр этого метода. Далее мы зададим навигационный контроллер в в качестве корневого контроллера вида в нашем окне. Здесь главное – не запутаться. UINavigationController – это фактически подкласс UIViewController, а свойство rootViewController, относящееся к нашему окну, принимает любой объект типа UIViewController. Таким образом, если мы хотим сделать навигационный контроллер корневым контроллером нашего вида, мы просто должны задать его в качестве корневого контроллера: