Шрифт:
Интервал:
Закладка:
— (void) switchIsChanged:(UISwitch *)paramSender{
if ([paramSender isOn]){
NSLog(@"Switch is on.");
} else {
NSLog(@"Switch is off.");
}
}
— (void)viewDidLoad{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"First Controller";
UISwitch *simpleSwitch = [[UISwitch alloc] init];
simpleSwitch.on = YES;
[simpleSwitch addTarget: self
action:@selector(switchIsChanged:)
forControlEvents: UIControlEventValueChanged];
self.navigationItem.rightBarButtonItem =
[[UIBarButtonItem alloc] initWithCustomView: simpleSwitch];
}
Вот что получается (рис. 1.40).
Рис. 1.40. Переключатель, добавленный на навигационную панель
На навигационной панели можно создавать очень и очень занятные кнопки. Просто взгляните, что делает Apple со стрелками, направленными вверх и вниз, расположенными в правом верхнем углу на рис. 1.36. А почему бы нам тоже так не сделать? Впечатление такое, как будто в кнопку встроен сегментированный элемент управления (см. раздел 1.8). Итак, нам нужно создать такой элемент управления с двумя сегментами, добавить его на навигационную кнопку и, наконец, поставить эту кнопку на навигационную панель. Начнем:
— (void) segmentedControlTapped:(UISegmentedControl *)paramSender{
switch (paramSender.selectedSegmentIndex){
case 0:{
NSLog(@"Up");
break;
}
case 1:{
NSLog(@"Down");
break;
}
}
}
— (void)viewDidLoad{
[super viewDidLoad];
self.title = @"First Controller";
NSArray *items = @[
@"Up",
@"Down"
];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc]
initWithItems: items];
segmentedControl.momentary = YES;
[segmentedControl addTarget: self
action:@selector(segmentedControlTapped:)
forControlEvents: UIControlEventValueChanged];
self.navigationItem.rightBarButtonItem =
[[UIBarButtonItem alloc] initWithCustomView: segmentedControl];
}
На рис. 1.41 показано, что должно получиться в итоге.
Рис. 1.41. Сегментированный элемент управления, встроенный в навигационную кнопку
Элемент navigationItem любого контроллера вида имеет еще два замечательных метода:
• setRightBarButtonItem: animated: — задает правую кнопку навигационной панели;
• setLeftBarButtonItem: animated: — определяет левую кнопку навигационной панели.
Оба метода позволяют указывать, хотите ли вы анимировать кнопку. Задайте значение YES для параметра animated, если анимация нужна:
UIBarButtonItem *rightBarButton =
[[UIBarButtonItem alloc] initWithCustomView: segmentedControl];
[self.navigationItem setRightBarButtonItem: rightBarButtonanimated: YES];
См. также
Подраздел «Создание и запуск вашего первого приложения для iOS» раздела 1.0 данной главы. Разделы 1.2, 1.8, 1.12.
1.16. Представление контроллеров, управляющих несколькими видами, с помощью UITabBarController
Постановка задачи
Необходимо дать пользователям возможность переключаться из одного раздела вашего приложения в другой, причем делать это просто.
Решение
Используйте класс UITabBarController.
Обсуждение
Если вы пользуетесь iPhone как будильником, то, разумеется, замечали на экране панель вкладок. Взгляните на рис. 1.38. В нижней части экрана расположены значки, которые называются World Clock (Мировое время), Alarm (Будильник), Stopwatch (Секундомер) и Timer (Таймер). Вся черная полоса в нижней части экрана — это панель вкладок, а вышеупомянутые ярлыки — ее элементы.
Панель вкладок — это контейнерный контроллер. Это значит, что мы создаем экземпляры UITabBarController и добавляем их в окно нашего приложения. Для каждого элемента панели вкладок мы добавляем на эту панель навигационный контроллер или контроллер вида. Эти элементы будут отображаться как вкладки на панели. Контроллер панели вкладок содержит панель вкладок типа UITabBar. Мы не создаем этот объект вручную — мы создаем контроллер панели вкладок, а уже он создает для нас такой объект. Проще говоря, считайте, что мы инстанцируем контроллер панели вкладок, а потом задаем контроллеры видов для этой панели. Данные контроллеры видов будут относиться к типу UIViewController или UINavigationController, если мы собираемся создать по контроллеру для каждого элемента панели вкладки (они же — контроллеры видов, задаваемые для контроллера панели вкладок). Навигационные контроллеры относятся к типу UINavigationController и являются подклассами от UIViewController. Следовательно, навигационный контроллер — это контроллер вида, но контроллеры видов, относящиеся к типу UIViewController, не являются навигационными контроллерами.
Итак, предположим, что у нас есть два контроллера видов. Классы этих контроллеров называются FirstViewController и SecondViewController:
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];
FirstViewController *firstViewController = [[FirstViewController alloc]
initWithNibName: nil
bundle: NULL];
SecondViewController *secondViewController = [[SecondViewController alloc]
initWithNibName: nil
bundle: NULL];
UITabBarController *tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:@[firstViewController,
secondViewController
]];
self.window.rootViewController = tabBarController;
return YES;
}
Когда панель вкладок отобразится на экране, ее элементы будут расположены именно так, как показано на рис. 1.38. Имя каждого из этих элементов основывается на названии того контроллера вида, который соответствует конкретному элементу. Определим заголовки для обоих контроллеров наших видов.
Когда загружается панель вкладок, вместе с ней загружается контроллер вида первого входящего в нее элемента. Все остальные контроллеры видов инициализируются, но их виды не загружаются. Это означает, что любой код, который вы напишете во viewDidLoad второго контроллера вида, не выполнится до тех пор, пока пользователь не нажмет второй элемент этой панели в первый раз. Поэтому если вы присвоите заголовок панели контроллеру второго вида в его viewDidLoad и запустите приложение, то обнаружите, что заголовок панели вкладок по-прежнему пуст.
Первый контроллер вида мы назовем First:
#import «FirstViewController.h»
@implementation FirstViewController
— (id)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName: nibNameOrNil
bundle: nibBundleOrNil];
if (self!= nil) {
self.title = @"First";
}
return self;
}
— (void)viewDidLoad{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
}
А второй контроллер вида будет называться Second:
#import «SecondViewController.h»
@implementation SecondViewController
— (id)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName: nibNameOrNil
bundle: nibBundleOrNil];
if (self!= nil) {
self.title = @"Second";
}
return self;
}
— (void)viewDidLoad{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
}
Теперь запустим приложение и посмотрим, что получилось (рис. 1.42).
Рис. 1.42. Очень простая панель вкладок, на которой находятся два контроллера вида
Как видите, у контроллеров видов нет навигационной панели. Что делать? Все просто. Как вы помните, UINavigationController — это подкласс UIViewController. Итак, мы можем добавлять экземпляры навигационных контроллеров на панель вкладок, а внутрь каждого навигационного контроллера загрузить контроллер вида. Чего же мы ждем?
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
// Точка переопределения для специальной настройки,
// выполняемой после запуска приложения.
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];
FirstViewController *firstViewController = [[FirstViewController alloc]
initWithNibName: nil
bundle: NULL];
UINavigationController *firstNavigationController =
- QT 4: программирование GUI на С++ - Жасмин Бланшет - Программирование
- Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен - Программирование
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- Стандарты программирования на С++. 101 правило и рекомендация - Герб Саттер - Программирование
- Программирование игр и головоломок - Жак Арсак - Программирование
- Генерация высококачественного кода для программ, написанных на СИ - Филипп Хислей - Программирование
- Программирование на Python с нуля - Максим Кононенко - Программирование
- C# 4.0: полное руководство - Герберт Шилдт - Программирование
- Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2 - Александр Фролов - Программирование
- От «Энигмы» до ChatGPT - Рустам Агамалиев - Программирование / Экономика