Чтение онлайн

ЖАНРЫ

Программирование на Objective-C 2.0
Шрифт:

При нажатии клавиши со знаком равенства (=) для выполнения операции вызывается метод clickEquals:. Калькулятор выполняет операцию между двумя дробями, сохраняя результат в накопителе (accumulator). Этот накопи гель считывается внутри метода clickEquals:, и результат выводится па дисплей. Класс Fraction

Класс Fraction мало отличается от предыдущих примеров этой книги. В нем имеется новый метод convertToString, который добавлен для преобразования дроби в эквивалентное строковое представление. В программе 21.2 показан файл секции interface для класса Fraction, после которого следует соответствующий файл секции implementation.

Программа 21.2. Interlace-файл Fraction.h #import <UIKit/UIKit.h> @interface Fraction : NSObject { int numerator; int denominator; } @property int numerator, denominator; -(void) print; -(void) setTo: -(Fraction *) add: (Fraction *) f; -(Fraction *) subtract: (Fraction *) f; -(Fraction *) multiply: (Fraction *) f; -(Fraction *) divide: (Fraction *) f; -(void) reduce; -(double) convertToNum; -(NSString *) convertToString; (int) n over: (int) d; @end

Программа 21.2. Implementation-файл Fraction.m #import "Fraction.h" @implementation Fraction @synthesize numerator, denominator; (void) setTo: (int) n over: (int) d { numerator = n; denominator = d; } -(void) print { NSLog (@"%i/%i", numerator, denominator); } -(double) convertToNum { if (denominator != 0) return (double) numerator / denominator; else return 1.0; } -(NSString *) convertToString; { if (numerator == denominator) if (numerator == 0) return @»0"; else return @»1"; else if (denominator == 1) return [NSString stringWithFormat: @"%i", numerator]; else return [NSString stringWithFormat: @"%i/%i", numerator, denominator]; } //

Сложение дроби (Fraction) с получателем -(Fraction *) add: (Fraction *) f { // Сложение двух дробей // a/b + c/d = ((a*d) + (b*c)) / (b * d) // в result будет сохраняться результат сложения Fraction * result = [[Fraction alloc] init]; int resultNum, resultDenom; resultNum = numerator * f.denominator + denominator * f.numerator; resultDenom = denominator * f.denominator; [result setTo: resultNum over: resultDenom]; [result reduce]; return [result autorelease]; } -(Fraction *) subtract: (Fraction *) f { // Вычитание двух дробей // a/b - c/d = ((a’ d) - (b*c)) / (b * d) Fraction *result = [[Fraction alloc] init]; int resultNum, resultDenom; resultNum = numerator * f.denominator - denominator * Enumerator; resultDenom = denominator * f.denominator; [result setTo: resultNum over: resultDenom]; [result reduce]; return [result autorelease]; } [Fraction *) multiply: (Fraction *) f { Fraction *result = [[Fraction alloc] init]; [result setTo: numerator * f.numerator over: denominator * f.denominator]; [result reduce]; return [result autorelease]; } -(Fraction *) divide: (Fraction *) f { Fraction *result = [[Fraction alloc] init]; [result setTo: numerator * f.denominator over: denominator * f.numerator]; [result reduce]; return [result autoreiease]; } -(void) reduce { int u = numerator; int v = denominator; int temp; if (u == 0) return; else if (u <0) u = -u; while (v != 0) { temp = u % v; u =v; v = temp; } numerator /= u; denominator /= u; } @end

Метод convertToString: проверяет числитель и знаменатель дроби, чтобы создать вид числа для внешнего отображения. Если числитель и знаменатель равны (но не равны нулю), возвращается @"Г. Если числитель равен нулю, то возвращается строка @"0". Если знаменатель равен 1, результатом является целое число, то есть показывать знаменатель не нужно.

Метод stringWithFormat:, который используется внутри convertToString:, возвращает строку в соответствии со строкой формата (аналогично NSLog) и список аргументов с разделителями-запятыми. Мы передаем аргументы методу, который принимает переменное число параметров, разделяя их запятыми, как при передаче аргументов функции NSLog. Класс Calculator, который работает с дробями

Теперь рассмотрим класс Calculator. Он аналогичен одноименному классу, с которым мы работали раньше, но теперь наш калькулятор должен «знать», как работать с дробями. Ниже приводятся файлы секций interface и implementation для класса Calculator.

Программа 21.2. Interface-файл Calculator.h #import <UIKit/UIKit.h> #import"Fraction.h" @interface Calculator: NSObject ( Fraction *operand1; Fraction *operand2; Fraction *accumulator; } @property (retain, nonatomic) Fraction *operand 1, *operand2, *accumulator; -(Fraction *) performOperation: (char) op; -(void) clear; @end

Программа 21.2. Implementation-файл Calculator.m «import "Calculator.h" @implementation Calculator @synthesize operand 1, operand2, accumulator; -(id) init { self = [super init]; operand 1 = [[Fraction alloc] init]; operand2 = [[Fraction alloc] init]; accumulator = [[Fraction alloc] init]; return self; } -(void) clear { if (accumulator) { accumulator.numerator = 0; accumulator.denominator = 0; } -(Fraction *) performOperation: (char) op { Fraction *result; switch (op) { case result = [operandl add: operand2]; break; case result = [operandl subtract: operand2]; break; case '*': result = [operandl multiply: operand2]; break; case result= [operandl divide: operand2]; break; accumulator.numerator = result.numerator; accumulator.denominator = result.denominator; return accumulator; } -(void) dealloc { [operand 1 release]; [operand2 release]; [accumulator release]; [super dealloc]; } @end Разработка

пользовательского интерфейса (Ul)

В папке Resources этого проекта содержатся два xib-файла: MainWindow.xib и Fraction CalculatorViewController.xib. Вам не требуется работать с первым файлом. Откроем второй файл, дважды щелкнув на его имени. При запуске Interface Builder вы увидите значокс именем “View" в окне с именем Fraction CalculatorViewController.xib (рис. 21.23).

Если окно View еще не открыто, дважды щелкните на этом значке и откройте его. Внутри окна View мы будем разрабатывать пользовательский интерфейс нашего калькулятора. Мы будем связывать каждую числовую клавишу с методом ctickDigit:. Для это нужно при нажатой клавише Control протянуть мышь к значку File’s Owner по очереди от каждой клавиши в окне Fraction_CalculatorViewController.xib и выбрать clickDigit: в раскрывающемся меню Events (События). Кроме того, для каждой числовой клавиши нужно задать в окне Inspector значение Tag, соответствующее названию клавиши. Дтя числовой клавиши с меткой 0 нужно задать значение Tag, равное 0, для клавиши с меткой 1 — значение 1, и т.д.

Протяните мышь от остальных клавиш в окне View и создайте соответствующие привязки. Не забудьте вставить метку для отображения (display) калькулятора и протяните мышь при нажатой клавише Control от File’s Owner к этой метке. Выберите display из появившегося списка Outlets.

Все! Структура интерфейса создана, и приложение с калькулятором дробей готово к работе.

Рис. 21.23. Окно Fraction_CalculatorViewController.xib 21.4. Сводка шагов

На рис. 21.24 показано окно проекта Xcode со всеми файлами, относящимися к проекту.

Рис. 21.24. Файлы проекта калькулятора дробей

Ниже приводится сводка шагов посозданию калькулятора дробей для iPhone.

Создание нового приложения типа View-based.

Ввод UI-кода в файлы Fraction_CalculatorViewControlleг с расширениями .h и .m.

Добавление в проект классов Fraction и Calculator.

Открытие окна Fraction CalculatorViewController.xib в Interface Builder для создания UI. "

Создание черного фона окна View.

Создание метки и клавиш (кнопок), их позиционирование внутри окна View.

При нажатой клавише Control протягивание мыши из File’s Owner к метке, созданной в окне View, и выбор для нес варианта “display".

При нажатой клавише Control протягивание мыши от каждой клавиши в окне View к File’s Owner и привязка к соответствующему action-методу. Для каждой числовой клавиши выбирается метод clickDigit:. Кроме того, для каждой числовой клавиши нужно присвоить атрибуту клавиши tag соответствующую цифру от 0 до 9, чтобы метод clickDigit: мог определить, какая клавиша была нажата.

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

Мы надеемся, что это краткое введение в разработку приложений iPhone поможет вам в разработке ваших собственных приложений iPhone. Как говорилось выше, UIKit предоставляет разработчику множество возможностей.

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

Добавьте клавишу Convert (Преобразование) в приложение для кал ькулято- ра дробей. При нажатии этой клавиши используйте метод convertToNum класса Fraction, чтобы создать десятичное представление для результата, полученного в виде дроби. Преобразуйте это число в строку и выведите его на дисплее калькулятора.

Поделиться с друзьями: