Главная » iPhone » Пример iPhone: настройки игры-стрелялки

0

Написана космическая игра-стрелялка, и ей необходим набор параметров для управления всем: от уровня громкости звука до отладочных сообщений. В данном примере класс и I PreferencesTable наследуется для создания нашего собственного объекта MyPreferencesTable. Этот объект служит в качестве таблицы предпочтений и ее собственного источника данных. Он создает каждую ячейку и назначает некоторые из элементов управления, о которых вы узнали в предыдущем разделе. Объект MyPreferencesTable построен как независимая таблица предпочтений, которая может быть использована классом MainView.

Данный пример может быть построен из командной строки с использованием пакета инструментов следующим образом:

$ arm-apple-darwin9-gcc -о MyExample MyExample.m MyPreferencesTable.m Ъ -lobjc -framework CoreFoundation -framework UIKit

Листинги 7.1 и 7.2 содержат код для приложения и основного вида, а листинги 7.3 и 7.4 создают саму таблицу предпочтений.

#import <CoreFoundation/CoreFoundation.h> # import <UIKit/UIKit.h> #import "MyPreferencesTable.h"

@interface MainView : UlView {

MyPreferencesTable *preferencesTable;

}

-   (id)initwithFrame:(CGRect)rect;

-   (void)dealloc; @end

@interface MyApp : UiApplication {

UlWindow *window; MainView *mainView;

}

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

Листинг 7.2. Пример таблицы предпочтений (MyExample.m)

# import "MyExample.h"

int main(int argc, char **argv) {

return UIApplicationMain(argc, argv, @"MyApp", @"MyApp");

}

(^implementation MyApp

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

];

CGRect rect = [ UIHardware 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) {

preferencesTable = [ [ MyPreferencesTable alloc ]

initWithFrame: rect ]; [ preferencesTable reloadData ]; [ self addSubview: preferencesTable ];

}

return self;

}

-    (void)dealloc {

[ self dealloc ]; [ super dealloc ];

}

@end

#import <UIKit/UIKit.h> #import <UIKit/UIPreferencesTable.h> #import <UIKit/UIPreferencesTextTableCell.h> #import <UIKit/UISwitchControl.h> #import <UIKit/UlSegmentedControl.h> #import <UIKit/UlSliderControl.h>

#define NUM_GROUPS 3 #define CELLS_PER_GROUP 4

©interface MyPreferencesTable : UiPreferencesTable

{

UiPreferencesTableCell *cells[NUM_GROUPS][CELLS_PER_GROUP]; UiPreferencesTableCell *groupcell[NUM_GROUPS];

UlSliderControl *musicVolumeControl; UlSliderControl *gameVolumeControl; UlSegmentedControl *difficultyControl;

UlSliderControl *shipStabilityControl; UlSwitchControl *badGuyControl; UlSwitchControl *debugControl;

}

-    (id)initwithFrame:(CGRect)rect;

-    (int)numberOfGroupsInPreferencesTable:(UIPreferencesTable *)aTable;

-    (UIPreferencesTableCell *)preferencesTable: (UIPreferencesTable *)aTable cellForGroup:(int)group;

-    (float)preferencesTable:(UIPreferencesTable *)aTable heightForRow:(int)row

inGroup:(int)group withProposedHeight:(float)proposed;

-    (BOOL)preferencesTable:(UIPreferencesTable *)aTable isLabelGroup:(int)group;

-    (UIPreferencesTableCell *)preferencesTable:

(UIPreferencesTable *)aTable cellForRow:(int)row inGroup:(int)group; @end

#import "MyPreferencesTable.h"

@implementation MyPreferencesTable – (id)initwithFrame:(CGRect)rect { self = [ super initwithFrame: rect ]; if (nil != self) { int i, j;

for(i=0;i<NUM_GROUPS;i++) { groupcell[i] = NULL; for(j=0;j<CELLS_PER_GROUP; j ++) cells[i][j] = NULL;

} .

[ self setDataSource: self ]; [ self setDelegate: self f;

}

return self;

}

-    (int)numberOfGroupsInPreferencesTable:(UIPreferencesTable *)aTable {

/* Количество логических групп, включая метки */ return NUM_GROUPS;

i

-    (int)preferencesTable:(UIPreferencesTable *)aTable numberOfRowsInGroup:(int)group

{

switch (group) { case(0): return 4; break; case(1): return 4; break; case (2):

return 1; /* Группа текстовых меток */ break;

-     (UIPreferencesTableCell *)preferencesTable: (UIPreferencesTable *)aTable cellForGroup:(int)group

{

if (groupcell[group] != NULL) return groupcell[group];

groupcell[group] = [ [ UIPreferencesTableCell alloc ] init J; switch (group) { case (0) :

[ groupcell[group] setTitle: ^"General Settings" ]; break; case (1):

[ groupcell[group] setTitle: @"Advanced Settings" ]; break;

}

return groupcell[group] ;

}

-     (float)preferencesTable:(UIPreferencesTable *)aTable heightForRow:(int)row

inGroup:(int)group withProposedHeight:(float)proposed

{

/* Возвращаем высоту заголовков группы */ if (row — -1) { if (group < 2) return 40;

}

/* Сегментированные элементы управления больше, чем остальные */ if (group = 0 && row == 2) return 65.0;

return proposed;

-    (BOOL)preferencesTable:(UiPreferencesTable *)aTable isLabelGroup:(int)group

(

if (group == 2)

return YES; return NO;

}

-    (UiPreferencesTableCell *)preferencesTable:

(UiPreferencesTable *)aTable cellForRow:(int)row inGroup:(int)group

{

UiPreferencesTableCell *cell;

if (cells[group][row] != NULL) return cells[group][row];

cell = [ [ UiPreferencesTableCell alloc ] init ]; [ cell setEnabled: YES ];

switch (group) { case (0):

switch (row) { case (0):

[ cell setTitle:©"Music Volume" ]; musicVolumeControl = [ [ UlSliderControl alloc ] initWithFrame: CGRectMake(170, 5, 120, 55)

];

[ musicVolumeControl setMinValue: 0.0 ]; [ musicVolumeControl setMaxValue: 10.0 ]; [ musicVolumeControl setValue: 3.5 ]; [ cell addSubview: musicVolumeControl ]; break; case (1) :

«

[ cell setTitle:@"Game Sounds" ];

gameVolumeControl = [ [ UlSliderControl alloc ] initwithFrame: CGRectMake(170, 5, 120, 55)

];

[ gameVolumeControl setMinValue: 0.0 ]; [ gameVolumeControl setMaxValue: 10.0 ]; [ gameVolumeControl setValue: 5.0 ]; [ cell addSubview: gameVolumeControl ]; break; case (2):

[ cell setTitle :Difficulty" ]; difficultyControl = [[ UlSegmentedControl alloc ]

initwithFrame: CGRectMake(170, 5, 120, 55) ]; [ difficultyControl insertSegment:0 withTitle:@"Easy" animated: NO J; [ difficultyControl insertSegment:1 withTitle"Hard" animated: NO ]; [ difficultyControl selectSegment: 0 ];

[ cell addSubview: difficultyControl ]; break; case (3):

[ cell release ];

cell = [ [ UIPreferencesTextTableCell alloc ] init ];

[ cell setTitle: @"Cheat Code" ]; t cell setEnabled: YES ]; ( cell setValue: @"None" ]; break;

)

break; case (1) :

switch (row) { case (0):

[ cell setTitle:(?"Ship Stability" ]; shipStabilityControl = [

[ UisiiderControl alloc ] initWithFrame: CGRectMake(170, 5, 120, 55)

1;

( shipStabilityControl setMinValue: 0.0 ]; [ shipStabilityControl setMaxValue: 100.0 ]; [ shipStabilityControl setValue: 45.0 ]; [ shipStabilityControl setShowValue: YES ]; [ cell addSubview: shipStabilityControl ]; break; case (1) :

[ cell setTitle:@"Extra Bad Guys" ]; badGuyControl = [ [ UlSwitchControl alloc ] initWithFrame:CGRectMake(170, 5, 120, 30)

];

[ badGuyControl setValue: 0.0 ]; [ cell addSubview: badGuyControl ]; break; case (2) :

[ cell setTitle:@"Debugging" ]; debugControl = [ [ UlSwitchControl alloc ] initWithFrame:CGRectMake(170, 5, 120, 30)

}!

[ debugControl setValue: 0.0 ]; [ debugControl setAlternateColors: YES ]; [ cell addSubview: debugControl ]; break; case (3):

[ cell release ];

cell = [ [ UIPreferencesTextTableCell alloc ] init ];

[ cell setTitle: @"Version" ]; [ cell setEnablea: NO ]; [ cell setValue: @"1.0.0" ]; break;

break; case (2):

[ cell setTitle: @"Settings will take effect on the next restart"

];

break;

}

r

[ cell setShowSelection: NO ]; cells[group][row] = cell; return cell;

}

@end

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

Вы только что прочитали полное приложение, отображающее таблицу предпочтений. Вот как оно работает:

1.         При порождении приложения создается объект MainView, который служит в качестве управляющего вида для приложения.

2.          Классом приложения вызывается метод initwithFrame объекта MainView. Тем самым порождается объект MyPreferencesTable с именем preferencesTable и вызывается его метод initwithFrame.

3.          Собственный метод initwithFrame таблицы предпочтений инициализирует внутренний кэш таблицы и определяет сам себя в качестве собственного источника данных для этой таблицы.

4.          Объект mainView вызвает метод reloadData объекта preferenceTable. Поскольку мы не подменили reloadData. то вызывается метод родительского класса UIPreferencesTable. Это порождает взаимодействие с источником данных путем вызова различных методов источника данных. Таблица предпочтений общается с источником данных, чтобы определить основную конструкцию и геометрию таблицы.

5.          Объект preferenceTable добавлен как подвид mainView, где основная платформа управления окнами вызывает свои процедуры отрисовки.

6.          Для всех строк, видимых на экране, вызывается метод celiForRow таблицы предпочтений.

7.     Сначала метод ceiiForRow проверяет, существует ли уже указатель для адресуемой ячейки предпочтений, и если не существует, то создает новый объект UiPreferencesTableCell. Заголовок и параметры задаются на основе количества строк и групп, и все элементы управления создаются и добавляются как подвиды ячейки предпочтений.

8.      Если создается новая ячейка, возвращается ее объект. Иначе возвращается кэшированный указатель на существующий объект. В любом случае внутренне вызываются низкоуровневые процедуры прорисовки объекта, и он прорисовывается на экране.

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

Теперь, когда вы получили представление о том, как работают таблицы

предпочтений, попробуйте выполнить некоторые упражнения для более

близкого знакомства с ними.

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

?         Воспользуйтесь примерами из главы 3 для построения приложения с двумя видами: один табличный или текстовый вид, а другой — таблица предпочтений. Назначьте какую-либо кнопку панели навигации для перехода пользователей к таблице предпочтений, если они нажимают кнопку Settings, и обратно к текстовому виду, если они нажимают кнопку Back.

?         Проверьте наличие U1 PreferencesTable.h, UIPreferencesTextTableCell.h, UIPreferencesControlTableCell.il и UlPreferencesTableCell.il в папке include вашего пакета инструментов. Вы найдете их в папке /too lc h a i n/sys/ i nc 1 ude/U IК i t.

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

По теме:

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