Главная » iPhone » Листы действий iPhone

0

iPhone— относительно небольшое устройство с достаточно ограниченным пространством на экране.и без пишущего пера. В связи с этим пользователю весьма непросто нащупывать кнопки пальцами, и он может случайно нажать не те кнопки. Если такое происходит, то продуманно написанное приложение запрашивает у пользователя подтверждение, прежде чем просто удалить важные данные. Для привлечения к себе внимания приложения на настольном компьютере отображают всплывающие окна. На iPhone же снизу всплывают листы действий (action sheets), затеняя при этом оставшуюся часть экрана до тех пор, пока пользователь не выберет нужный вариант действий. Термин лист (sheet) продолжает метафору страниц, используемую Apple для iPhOne.

Создание листа действий

Iucm действии (action sheet) — это объект, который может быть порожден >верх любого вида, а единичный вид может хранить целый ряд различных листов действий. Основной лист действий состоит из заголовка, текста тела и ех вариантов действий, среди которых должен осуществлять свой выбор •льзователь. Он порождается точно так же, как и другие объекты uiview с мощью метода initwithFrame. Поскольку листы предупреждений появляются внизу, то координаты окна можно отсчитывать вниз от половины экрана (Г =240):

UIActionSheet *actionSheet = [ [ UIActionSheet alloc ]

initwithFrame: CGRectMake(0, 240, 320, 240) ]; [ actionSheet setTitle:@"Computer doesn’t like people" ]; [ actionSheet setBodyText: [ NSString stringWithFormat: @"I did not complete your request because I don’t like humans." ]

1;

( actionSheet setDelegate: self ];

Листы действий могут растянуть рамку, чтобы вместить все элементы, которые необходимо отобразить, поэтому статического прямоугольника 320×240 должно быть достаточно для стандартных листов действий.

Как и панели навигации, листы действий могут поддерживать один из трех стилей (табл. 3.4).

Таблица 3.4

Стиль

Описание

0

Стиль по умолчанию, серый цвет фона, белый цвет текста

1

Сплошной черный цвет, белый цвет текста

2

Прозрачный черный цвет фона, белый цвет текста

Стиль может быть задан с помощью вызова setActionSheetstyle: [ actionSheet setActionSheetStyle: 0 ];

Кнопки листа действий

В редких случаях имеет смысл отображать лист действий с кнопками, например, для отображения индикатора выполнения (описанного в главе 7). Однако в большинстве случаев листы предупреждения выводятся только с целью напоминания пользователю о чем-либо. Листы предупреждения могут вмещать в себя столько кнопок, сколько их может поместиться на экране. Чтобы добавить кнопку, вызовите метод addButtonWithTitle листа действий: [ actionSheet addButtonWithTitle"OK" ];

Кнопки уничтожения

Кнопки, подтверждающие полное удаление или какое-либо другое действие, которое может привести к уничтожению данных, должны использовать то, что в API называется кнопкой уничтожения (destructive button). Кнопки уничтожения отображаются ярко-красным цветом, чтобы предупредить пользователя о том, что он собирается выполнить какое-либо важное действие, которое невозможно будет отменить.

Метод setDestructiveButtonindex используется для того, чтобы пометить кнопку как кнопку уничтожения. Он принимает на вход порядковый номер кнопки:

[ actionSheet addButtonWithTitle:@"Confirm Delete" ]; [ actionSheet setDestructiveButtonindex: 0 ];

Отображение листа действий

После того как вы определитесь с текстом и кнопками, которые нужно отобразить, вы уже можете вывести лист пользователю. В зависимости от желаемого эффекта можно вызвать пять различных методов. Каждый из этих методов принимает класс, производный от uiview, который должен быть указателем на класс того вида, который задействован листом действий: ! actionSheet presentSheetFromAboveView: myView ]; i actionSheet presentSheetFromBehindView: myView ]; ; actionSheet presentSheetFromButtonBar: buttonBar ]; actionSheet presentSheetlnView: myView ]; actionSheet presentSheetToAboveView: myView ];

Наиболее распространенный способ вызова листа действий — это с помощью presentSheetlnView, который может быть вызван из вида, используя в качестве аргумента self.

Перехват нажатий кнопок

?сле того как лист действий отображен, элемент управления возвращается в пгюграмму. Как было показано ранее в этой главе, многие объекты исполь- ют метод обратного вызова под названием buttonciicked всякий раз, когда льзователь касается какой-либо кнопки. Это позволяет приложению продолжать свое выполнение в фоне и прерываться только тогда, когда что-т^ действительно происходит.

Далее представлен прототип метода обратного вызова для листа действий. Если делегат листа действий настроен на вызываемый вид, то ожидается, что этот вызываемый вид будет отвечать на нажатие кнопки:

-   (void)actionSheet:(UIActionSheet *)sheet buttonClicked:(int)button;

Метод buttonClicked вызвается с указателем на выбранный лист и порядковый номер кнопки. Кнопки пронумерованы сверху вниз, начиная с 1 (они нумеруются не с 0, как другие значения):

-   (void)actionSheet:(UIActionSheet *)sheet buttonClicked:(int)button { if (sheet == actionSheet) {

switch(button) { case 1:

/* Нажата самая верхняя кнопка */ break; case 2:

/* Нажата вторая сверху кнопка */ break;

) %

}

}

Отмена листа действий

Наконец, после обработки нажатия кнопки лист действий должен исчезнуть с экран&, если только, конечно же, приложению не требуется, чтобы пользователь нажал еще и другие кнопки. Чтобы убрать лист с экрана, воспользуйтесь методом dismiss: [ sheet dismiss ];

Пример: кнопка "End-of-the-World"

Правительство решило, что президенту было бы гораздо удобнее носить с собой iPhone вместо чемоданчика с большой красной кнопкой. Один из их главных программистов без труда написал приложение End-of-the-World.арр.

которое президент может запустить в любой момент, чтобы пустить в ход ядерное оружие, которое приведет к концу света (или. по крайней мере, к началу передела мира). Однако существует проблема, связанная с возможными множественными случайными нажатиями этой кнопки. С вами заключили контракт на добавление к этому приложению листа подтверждения на случай, если президент на самом деле не хотел, чтобы наступил конец света.

Наше приложение-пример отображает панель навигации с кнопкой End World. При нажатии она сначала запросит подтверждение, прежде чем наступит конец света. Полиморфизм будет проиллюстрирован присутствием двух методов buttonClicked. При нажатии кнопки панели навигации автоматически будет вызываться корректный метод buttonClicked.

Листинги 3.11 и 3.12 могут быть построены с использованием пакета инструментов с помощью следующей командной строки:

$ arm-apple-darwin9-gcc -о MyExample MyExample.m -lobjc ^

-framework CoreFoundation -framework Foundation -framework UIKit

#import <CoreFoundation/CoreFoundation.h> «import <UIKit/UIKit.h> #import <UIKit/UIActionSheet.h> #import <UIKit/UINavigationBar.h>

@interface MainView : UlView {

UIActionSheet *endWorldSheet; UIActionSheet *deniedSheet; UINavigationBar *navBar; } . ‘

-   (id)initwithFrame:(CGRect)frame;

-   (void) dealloc;- 0end

^interface MyApp : UIApplication

{

UlWindow *window; MainView *mainView;

}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification; @end

#import "MyExample.h"

int main(int argc, char **argv)

{

NSAutoreleasePool *autoreleasePool = [ [ NSAutoreleasePool alloc ] init

1;

int returnCode = UIApplicationMain(argc, argv, @"MyApp", @"MyApp"); [ autoreleasePool release ]; return returnCode;

}

@implementation MyApp

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { window = [ [ UlWindow alloc ] initWithContentRect: [ UlHardware fullScreenApplicationContentRect ]

];

CGRect rect = [ UlHardware fullScreenApplicationContentRect ]; rect.origin.x = rect.origin.у = O.Of;

mainView = [ [ MainView alloc ] initwithFrame: rect ];

[ window setContentView: mainView ]; [ window orderFront: self ];

[ window makeKey: self ]; [ window _setHidden: NO ];

}

@end

@implementation MainView

-    (id)initWithFrame:(CGRect)rect { self = [ super initWithFrame: rect ]; if (nil != self) {

/* Создаем кнопку конца света */

navBar = [ [UINavigationBar alloc] initWithFrame:

CGRectMake(rect.origin.x, rect.origin.у, rect.size.width, 48.Of)

];

[ navBar setDelegate: self ];

[ navBar enableAnimation ];

[ navBar showLeftButton:nil withStyle: 0

rightButton"End World" withStyle: 3 ]; [ self addSubview: navBar ];

}

return self;

-     void)actionSheet:(UIActionSheet *)sheet buttonClicked:(int)button

if (sheet == endWorldSheet) { if (button ==1) {

/* Сюда поместите свой код, реализующий конец света */

/* TODO: Хотите ли вы отменить лист прежде, чем наступит конец света? */

sheet dismiss ];

-     (void)navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button {

/* Спросите о конце света */

endWorldSheet = [ [ UIActionSheet alloc ] initWithFrame: CGRectMake(0, 240, 320, 240)

];

[ endWorldSheet setTitle: @"Please Confirm" ];

[ endWorldSheet setBodyText:@"I noticed you are trying to end the world. Are you sure you want to do this?" ];

[ endWorldSheet addButtonWithTitle:@"End World" ];

[ endWorldSheet setDestructiveButtonlndex: 0];

[ endWorldSheet addButtonWithTitle:@"Cancel" ];

[ endWorldSheet setDelegate: self ];

[ endWorldSheet presentSheetlnView: self ];

}

-     (void)dealloc {

[ self dealloc ]; [ super dealloc ];

}

@end

Как это работает

Эта программа работает следующим образом:

1.         При порождении приложения создается объект Mainview и вызывается его метод initWithFrame. Тем самым создаются и отображаются пользователю вид и панель навигации.

2.          Когда пользователь нажимает кнопку End World, объект уведомляет метод своего делегата buttonClicked. Поскольку ожидается, что объект панели навигации передаст указатель на себя, то вызывается именно метод buttonClicked, принимающий параметр UINavigationBar * (исходя из правил полиморфизма).

3.     Метод buttonClicked создает лист действий, вызываемый endworlasheet, и представляет его пользователю. Он незамедлительно возвращает управление, но делает содержимое вида затененным и недоступным для пользователя.

4.      Когда пользователь нажимает кнопку на листе действий, объект листа предупреждения уведомляет метод своего делегата buttonClicked. Поскольку класс листа предупреждения передает параметр uiActionSheet *, то вызывается соответствующая версия buttonClicked.

5.      Метод сравнивает передаваемый в него указатель с указателем на endWorldSheet. Если это один и тот же указатель, то метод узнает о том, что в листе нажата кнопка. Затем он смотрит на порядковый номер кнопки и предпринимает соответствующие действия.

6.      Если пользователь подтверждает свое решение нажатием кнопки End World, то сам метод buttonClicked создает и отображает новый лист действий, информирующий пользователя о том, что произошла ошибка.

7.     Когда пользователь нажимает кнопку ОК, то снова вызывается тот же самый метод buttonClicked, и только в этот раз передаваемый в него указатель листа действий будет указателем deniedSheet. Метод без промедления игнорирует его и просто отменяет лист действий, не предпринимая при этом каких-либо дальнейших действий.

Для дальнейшего изучения

Протестируйте листы действий, чтобы лучше понять, как они работают.

П Поэкспериментируйте с добавлением различных кнопок в лист действий. Сколько кнопок поместиться на экране? Какой длины текст они смогут уместить? .                                                                                                                                                  ,

?         Создайте лист действий без кнопок, который бы информировал пользователя о том, что загружается какой-либо файл. Используйте NSTimer, чтобы подождать 10 секунд, а затем отмените лист, вообще не применяя метод buttonClicked.

?         Проверьте наличие прототипов UiActionSheet.h в каталоге вашего пакета инструментов include. Вы найдете их в папке /toolchain/sys/usr/include/ UIKit/. Поэкспериментируйте с некоторыми менее документированными методами.

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии