Программирование на 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]; } //
Метод 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, чтобы создать десятичное представление для результата, полученного в виде дроби. Преобразуйте это число в строку и выведите его на дисплее калькулятора.