iOS. Приемы программирования - страница 43
>NSMutableArray *newControllers = [NSMutableArray
>arrayWithArray: currentControllers];
>/* Удаляем последний объект из массива. */
>[newControllers removeLastObject];
>/* Присваиваем этот массив навигационному контроллеру. */
>self.navigationController.viewControllers = newControllers
>}
Этот метод можно вызвать внутри любого контроллера вида, чтобы поднять последний контроллер вида из иерархии навигационного контроллера, связанного с контроллером вида, который отображается в настоящий момент.
Обсуждение
Экземпляр класса UINavigationController содержит массив объектов UIViewController. Получив этот массив, вы можете оперировать им как угодно. Например, можно удалить контроллер вида из произвольного места в массиве.
Если мы напрямую управляем контроллерами видов, связанными с навигационным контроллером, то есть путем присвоения массива свойству viewControllers навигационного контроллера, то весь процесс будет протекать без явного перехода между контроллерами и без анимации. Если вы хотите, чтобы эти действия анимировались, используйте метод setViewControllers: animated:, относящийся к классу UINavigationController, как показано в следующем фрагменте кода:
>– (void) goBack{
>/* Получаем актуальный массив контроллеров видов. */
>NSArray *currentControllers = self.navigationController.viewControllers;
>/* Создаем на основе этого массива изменяемый массив. */
>NSMutableArray *newControllers = [NSMutableArray
>arrayWithArray: currentControllers];
>/* Удаляем последний объект из массива. */
>[newControllers removeLastObject];
>/* Присваиваем этот массив навигационному контроллеру. */
>[self.navigationController setViewControllers: newControllers
>animated: YES];
>}
1.14. Демонстрация изображения на навигационной панели
Постановка задачи
В качестве заголовка контроллера вида, ассоциированного в данный момент с навигационным контроллером, требуется отобразить не текст, а изображение.
Решение
Воспользуйтесь свойством titleView навигационного элемента контроллера вида:
>– (void)viewDidLoad{
>[super viewDidLoad];
>/* Создаем вид с изображением, заменяя им вид с заголовком. */
>UIImageView *imageView =
>[[UIImageView alloc]
>initWithFrame: CGRectMake(0.0f, 0.0f, 100.0f, 40.0f)];
>imageView.contentMode = UIViewContentModeScaleAspectFit;
>/* Загружаем изображение. Внимание! Оно будет кэшироваться. */
>UIImage *image = [UIImage imageNamed@"Logo"];
>/* Задаем картинку для вида с изображением. */
>[imageView setImage: image];
>/* Задаем вид с заголовком. */
>self.navigationItem.titleView = imageView;
>}
Предыдущий код должен выполняться в контроллере вида, находящемся внутри навигационного контроллера.
Я уже загрузил изображение в группу ресурсов моего проекта и назвал это изображение Logo. Как только вы запустите это приложение с приведенным фрагментом кода, увидите результат, напоминающий рис. 1.35.
Рис. 1.35. Вид с изображением на нашей навигационной панели
Обсуждение
Навигационный элемент каждого конкретного контроллера вида может отображать два различных вида контента в той области контроллера вида, которой этот элемент присвоен:
• обычный текст;
• вид.
Если вы собираетесь работать с текстом, можете использовать свойство title навигационного элемента. Тем не менее, если вам требуется более полный контроль над заголовком или вы просто хотите вывести над навигационной панелью изображение или любой другой вид, можете использовать свойство titleView навигационного элемента контроллера вида. Ему можно присваивать любой объект, являющийся подклассом класса UIView. В примере мы создали вид для изображения, а затем присвоили ему изображение. Потом вывели это изображение в качестве заголовка вида, в настоящий момент находящегося на навигационном контроллере.