>– (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. Таким образом, если мы хотим сделать навигационный контроллер корневым контроллером нашего вида, мы просто должны задать его в качестве корневого контроллера: