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

Уведомления (сообщения)

В этом примере рассмотрим класс UIAlertView и в Xcode напишем простую программу в которой при нажатии на кнопки будут вызываться разные типы сообщений:

• Auto-dismissed Alert – сообщение которое автоматом закрывается без вмешательства пользователя;
• Simple Alert — простое сообщение говорящее о каком-то событии;
• Complex Alert – Составной Alert, здесь Alert содержит три кнопки две из них вызывают другие Alertы, а третья просто закрывает сообщение.

В первую очередь обобщенно рассмотри что такое UIAlertView, и как он работает, затем перейдем к коду.

Класс UIAlertView используется для вывода уведомлений пользователю, в которых сообщается о каком-то случившемся событии (например » Отсутсвует интернет соединение»), или запрашивается подтверждение на выполнение какого-либо действия (например «Удалить файл image01.png?»).

Как правило до тех пор пока это сообщение не будет обработано доступ к программе будет закрыт. Принцип работы сообщений несложный. Чтоб отобразить сообщение нужно создать экземпляр класса UIAlertView и вызвать его метод show. Для закрытия нужно действие со стороны пользователя. При этом представление уведомляет своего делегата с помощью метода clickedButtonAtIndexэтот метод позволяет определить какая именно кнопка была нажата.

Теперь то же самое но подробно и с кодом. Запускаем Xcode, создаем новый проект на базе шаблона View-based Application.

 

Жмем Next. Название проекта MyAlert в Device Family выбираем iPhone.

 

Снова жмем Next и указываем куда сохранить проект. Все, проект создан. Теперь перейдем к коду.

Файлы MyAlertAppDelegate.h и MyAlertAppDelegate.m изменять не потребуется, править будем файлы контроллера, этоMyAlertViewController.h и MyAlertViewController.m, а так-же MyAlertViewController.xib.

В первую очередь создадим самый распространенный и простой Alert. Щелкаем по заголовочному файлу контроллераMyAlertViewController.h и прописываем в нем следующий код.

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface MyAlertViewController : UIViewController &lt;UIAlertViewDelegate&gt; {

}
-(IBAction)simpleAlert;
-(IBAction)complexAlert;
-(IBAction)autoAlert;

@end</code>

 

Подключаем к классу MyAlertViewController протокол UIAlertViewDelegate. Он будет вызывать метод clickedButtonAtIndex который в свою очередь отправит делегату информацию о том какая именно из кнопок алерта была нажата. Чтобы больше не возвращаться к редактированию этого файла я так-же прописал IBAction для будущих кнопок это simpleAlertcomplexAlert и autoAlert.

Теперь в IB (Interface Builder) необходимо создать саму кнопку которая будет вызывать Alert и связать эту кнопку с нашим методомsimpleAlert. Для этого щелкаем на файле MyAlertViewController.xib перетаскиваем из библиотеки в основное окно объект кнопкуRound Rect Button, кликаем на ней 2 раза и вписываем имя Simple Alert.

 

Для связи только что добавленной кнопки с кодом нажмите на ней правой кнопкой мышки и удерживая перетащите указатель на File’s Owner.

 

В появившемся меню выбираем simpleAlert

 

Чтобы проконтролировать, что все сделано правильно можно кликнуть на кнопке Simple Alert (которую мы создали) правой кнопкой мыши и убедится что в появившемся меню есть связь.

А сейчас напишем реализацию нашего контроллера. Щелкаем по файлу MyAlertViewController.m появиться много методов, в нашем случае они не нужны можете их удалять. Ниже показан финальный код.

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

@implementation MyAlertViewController

-(IBAction)simpleAlert {
    UIAlertView *simpleAlert = [[UIAlertView alloc] initWithTitle:@"Simple Alert" 
                                                          message:@"Alert's message" 
                                                         delegate:self 
                                                cancelButtonTitle:@"OK" 
                                                otherButtonTitles:nil];
    [simpleAlert show];
    [simpleAlert release];
}
-(IBAction)complexAlert {

}
-(IBAction)autoAlert {

}

@end</code>

 

Можно запустить программу в симуляторе CTR+R и при нажатии на кнопку должно всплывать сообщение.

Теперь разберем код по косточкам.
UIAlertView *simpleAlert – говорим что нам нужно будет создать экземпляр класса UIAlertView с именем simpleAlert. Звездочка перед simpleAlert говорит о том что переменная simpleAlert будет является указателем на наш только что созданный экземпляр класса. Если не знаете что такое указатель можно почитать здесь.

[UIAlertView alloc] –  вызываем метод alloc который возвращает указатель на область памяти выделенную для нашего вновь созданного объекта (экземпляра класса). Этот указатель и будет храниться в нашей переменной SimpleAlert.

Теперь мы должны инициализировать наш созданный объект а так-же указать ряд параметров отвечающих за то как будет выглядеть наш Alert.
initWithTitle:@”Simple Alert” – указываем заголовок окна.
message:@” Alert’s message” – основной текст-сообщение Alert.
delegate:self – указываем что будет принимать делегат в данном случае мы отправляем самих себя (self). Именно отсюда делегат и узнает какая кнопка была нажата пользователем.
cancelButtonTitle:@”OK” – указываем текст для кнопки закрытия окна Alert.
otherButtonTitles:nil – указываем название дополнительных кнопок, если указан nil (наш случай) то кнопок просто не будет.
[simpleAlert show] – мы вызываем метод show нашего экземпляра simpleAlert. Этот метод и выводит на экран наше сообщение. До этого момента оно просто хранилось в памяти.
[simpleAlert release] – мы посылаем сообщение release, тем самым, дав команду на освобождение памяти, которую занимает наш объект simpleAlert.

Вот как все просто, благодаря Cocoa, все написано за нас, нам остается лиш разобраться с тем как правильно использовать готовые классы.

Давайте перейдем к следующему примеру дописываем наш метод autoAlert в файле MyAlertViewController.m как указано ниже.

<code data-result="[object Object]">-(IBAction)autoAlert {
    UIAlertView *autoAlertView = [[UIAlertView alloc] initWithTitle:@"" 
                                                            message:@"Auto alert" 
                                                           delegate:self 
                                                  cancelButtonTitle:nil 
                                                  otherButtonTitles:nil];
    autoAlertView.transform = CGAffineTransformMake(1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f);
    [autoAlertView performSelector:@selector(dismissWithClickedButtonIndex:animated:) 
                        withObject:nil 
                        afterDelay:2.0f];
    [autoAlertView show];
    [autoAlertView release];
}</code>

Ах да, надо ведь еше добавить кнопку для этого метода. Идем в IB добавляем кнопку как описано выше, даем ей название Auto-dismissed Alert, сразу же добавим и третью кнопку для будущего метода. Назовем ее Complex Alert. Теперь обязательно нужно установить связь кнопок с кодом. Как и в прошлый раз жмем на кнопке правой кнопкой мышки и тянем линию на File’s Owner. В появившемся меню для кнопки Auto-dismissed Alert выбираем autoAlert, а для кнопки Complex Alert выбираем complexAlert.

 

 

Пробуйте запустить, и нажмите на кнопку Auto-dismissed Alert что мы видим? Появилось Alert окно без заголовка, без кнопки, повисело 2 сек и само закрылось. Идем в код разбираем его.

Здесь практически все то же самое, но есть отличия initWithTitle:@»» содержит пустую строку казалось бы можно было-бы просто поставить nil это просто удалит заголовок initWithTitle:nil, но тогда основной текст съедет вверх и это будет некрасиво.

 

message и delegate без изменеий а у cancelButton:nil – удалена кнопка отмены, закрытие окна описано ниже.

autoAlertView.transform – обращаемся к свойству transform нашего экземпляра класса autoAlertView другими словами мы изменяем форму окна Alert.

CGAffineTransformMake (1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f) это функция имеющая 6 флоатных параметров. Здесь можно настраивать позиционирование и размер окна. Чтоб узнать подробней зажмите alt и кликните на CGAffineTransformMake в появившемся окне опять кликните на CGAffineTransformMake откроется хелп.

[autoAlertView performSelector:@selector(dismissWithClickedButtonIndex:animated:) withObject:nil afterDelay:2]; – эта строка вешает селектор – действие.
(dismissWithClickedButtonIndex:animated:) – это и есть само действие, оно удаляет Alert с экрана.
withObject:nil – это значит что в наше действие не передается никаких параметров.
afterDelay:2.0f – указываем через сколько секунд должно выполниться действие (удаление Alert).

 

Дальше ничего нового.

Разбираем третий вариант. По сути он ничем не сложнее предыдущих, но кода требуется больше из за того что помимо методаcomplexAlert добавим еще один метод, clickedButtonAtIndex. Это специальный метод предназначен для отлавливания событий возникающих при нажатии кнопок в каком либо Alert. Вобщем когда в Alert вы нажмете на кнопку автоматом запуститься методclickedButtonAtIndex. Вот так выглядит реализация класса MyAlertViewController.

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

@implementation MyAlertViewController

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (alertView.tag == 1) {
        if (buttonIndex == 1) {
            UIAlertView *subAlert = [[UIAlertView alloc] initWithTitle:@"Sub-Alert" 
                                                               message:@"You've chosen "Sure"." 
                                                              delegate:self 
                                                     cancelButtonTitle:@"OK" 
                                                     otherButtonTitles:nil];
            [subAlert show];
            [subAlert release];
        }
        else if (buttonIndex == 2) {
            UIAlertView *subAlert = [[UIAlertView alloc] initWithTitle:@"Sub-Alert" 
                                                               message:@"You've chosen "Not sure"." 
                                                              delegate:self 
                                                     cancelButtonTitle:@"OK" 
                                                     otherButtonTitles:nil];
            [subAlert show];
            [subAlert release];
        }
    } else if (alertView.tag == 2) {

    }
}

-(IBAction)simpleAlert {
    UIAlertView *simpleAlert = [[UIAlertView alloc] initWithTitle:@"Simple Alert" 
                                                          message:@"Alert's message" 
                                                         delegate:self 
                                                cancelButtonTitle:@"OK" 
                                                otherButtonTitles:nil];
    [simpleAlert show];
    [simpleAlert release];
}

-(IBAction)complexAlert {
    UIAlertView *complexAlert = [[UIAlertView alloc] initWithTitle:@"Complex Alert" 
                                                           message:@"Select an action" 
                                                          delegate:self 
                                                 cancelButtonTitle:@"OK" 
                                                 otherButtonTitles:@"Sure",@"Not sure",nil];
    complexAlert.tag = 1;
    [complexAlert show];
    [complexAlert release];
}

-(IBAction)autoAlert {
    UIAlertView *autoAlertView = [[UIAlertView alloc] initWithTitle:@"" 
                                                            message:@"Auto alert" 
                                                           delegate:self 
                                                  cancelButtonTitle:nil 
                                                  otherButtonTitles:nil];
    autoAlertView.transform = CGAffineTransformMake(1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f);
    [autoAlertView performSelector:@selector(dismissWithClickedButtonIndex:animated:) 
                        withObject:nil 
                        afterDelay:2.0f];
    [autoAlertView show];
    [autoAlertView release];
}

@end</code>

 

Запустите приложение и потестируйте новый алерт. В методе complexAlert есть два нововведения otherButtonTitles:@”Sure”, @”Not Sure” – здесь мы видим что добавлены две дополнительные кнопки и добавляются они через запятую. Чтобы указать окончания добавления кнопок в конце следует написать nil (вам это ничего не напоминает?). Фактически otherButtonTitles в качестве параметра принимает массив (NSArray), просто в предыдущих случаях мы передавали ему пустой массив.

complexAlert.tag = 1 – здесь мы назначаем метку нашему Alert. Это делается для того чтобы метод clickedButtonAtIndex смог определить в каком именно алерте мы нажали на кнопку.

Теперь смотрим метод clickedButtonAtIndex. Видно что метод принимает два аргумента:
alertView:(UIAlertView *)alertView – сюда принимаются сами алерты, а уже у самих алертов есть свойство .tag, по нему и определим из какого алерта вызван этот метод.
(NSInteger)buttonIndex – здесь определяется какая именно кнопка была нажата в самом Alert. Основная кнопка отмены всегда имеет идентификатор 0, дополнительным кнопкам идентификаторы присваиваются по порядку 1,2,3… в нашем случае кнопка Sure получит идентификатор 1, а кнопка Not Sure – 2.

Дальше идет стандартное ветвление операторов if (подробнее об этом операторе можно прочитать здесь) благодаря которым мы и определим какой дополнительный алерт нужно создать. Глвное понимать что alertView.tag – это идентификатор самого окна Alert, аbuttonIndex – идентификатор кнопки Alert.

Последнее ветвление else if (alertView.tag == 2){… специально оставлено пустым. Заполните его сами сделайте так чтобы при нажатии кнопки «OK» в Simple Alert создавался еще какой нибудь алерт.

Исходный код можно скачать здесь.