|
Май
23
|
Те, кто уже попробовал создать приложение Hello World, могут попробовать свои силы в чем-то более функциональном.
Откройте Xcode, создайте новый проект “Window-Based Application” с именем “Calculator“, создайте контроллер представления “View Controller” с именем “Calc“, а также представление “Calculator“.
Теперь нам понадобится один объект, пара переменных и методы в файле “Calc.h“:
1 2 3 4 5 6 7 8 9 10 11 12 | #import <UIKit/UIKit.h> @interface Calc : UIViewController { float result; IBOutlet UILabel *calculatorScreen; int currentOperation; float currentNumber; } -(IBAction)buttonDigitPressed:(id)sender; -(IBAction)buttonOperationPressed:(id)sender; -(IBAction)cancelInput; -(IBAction)cancelOperation; @end |
- “result” для типа “float” — число в памяти, результат последней операции
- “calculatorScreen” для типа “UILabel” показывает результат операции или вводимое пользователем число
- “currentOperation” для типа “int” является идентификатором операции (1 — сложение, 2 — вычитание, 3 — умножение, 4 — деление, 0 — равенство)
- “currentNumber” для типа “float” — вводимое пользователем число для каждой следующей операции (выводится на “calculatorScreen“)
- метод “buttonDigitPressed:(id)sender” вызывается при нажатии пользователем одной из кнопок 0-9 (для всех десяти метод будет один). Конечно, можно было предусмотреть и десять методов типа “-(IBAction)button6Pressed“, но я научу определять запрашивающую метод кнопку с помощью “(id)sender“
- “buttonOperationPressed:(id)sender” — точно такой же единственный метод для пяти операций: сложения (addition), вычитания (subtraction), умножения (multiplication), деления и равенства (equals).
- “cancelInput” и “cancelOperation” при нажатии пользователем “C” или “AC“
Откройте “Calculator.xib” и перетащите туда 17 кнопок и метку, разместив, как показано ниже:

Не забудьте отрегулировать размер метки “Label“, чтобы туда помещались и большие числа. Открыв окно инспектора, щелкните на каждой из кнопок 0-9 и в атрибутах “Button Attributes” назначьте 0, 1, 2, 3, 4…тэгами [Tag = 5 for 5 Button, Tag = 7 for 7 Button]… То же проделайте с кнопками операций. Tag = 1 для сложения, 2 — для вычитания, 3 — для умножения, 4 — для деления, 0 для равенства. Ноль — тэг по умолчанию, поэтому вводить его вручную необходимости нет.


Теперь выделите в файле “Calculator.xib” объект “File’s Owner“. В качестве класса в меню “Object Identity” введите “Calc“. Теперь в меню “Calc Connections” свяжите представление с представлением, “calculatorScreen” с меткой. После этого привяжите кнопки к действиям. “buttonDigitPressed:” соедините с “0 Button’s Touch up inside“. Хотя теперь этот метод вызывается через “0 Button“, сюда же можно привязать и другие кнопки. Снова щелкните на кружке рядом с “buttonDigitPressed:” и свяжите его с “1 Button“. Если все вышло, установите связи с остальными кнопками. Проделайте те же действия с “buttonOperationPressed:“, связав метод с операциями равенства, сложения, вычитания, умножения и деления. После этого свяжите “cancelInput” с “C“, а “cancelOperation” — с “AC“.

В редакторе IB мы сделали все, что было нужно. Сохранив файл “Calculator.xib“, вернитесь в Xcode.
Добавьте приведенные ниже стандартные строки кода в файлы “CalculatorAppDelegate.h/.m“:
1 2 3 4 5 | #import "Calc.h" @class Calc; Calc *viewController = [[Calc alloc] initWithNibName:@"Calculator" bundle:[NSBundle mainBundle]]; [window addSubview:[viewController view]]; |
Щелкнув на кнопке “Build and Go“, посмотрите, как выглядит проект в симуляторе. Пока никаких операций он не выполняет, поскольку приложение располагает лишь именами методов в заголовочном файле класса “Calc” (”Calc.h). Теперь их нужно внедрить в “Calc.m“.
1 2 3 4 5 6 7 | "-(IBAction)buttonDigitPressed:(id)sender" <<<врезка с кодом -(IBAction)buttonDigitPressed:(id)sender { currentNumber = currentNumber*10 + (float)[sender tag]; calculatorScreen.text = [NSString stringWithFormat:@"%.2f",currentNumber]; } |
Каждый раз при вызове указанного выше метода меняется значение “currentNumber“. [sender tag] возвращает введенное число как тэг для каждой из кнопок 0-9. Ниже приведен пример того, как выглядит “currentNumber” после нажатия кнопки с цифрой:
- 0 (исходное значение)
- пользователь жмет 5: 0*10 + 5 = 5
- пользователь жмет 9: 5*10 + 9 = 59
- пользователь жмет 2: 59*10 + 2 = 592
Меняется и текст “calculatorScreen“, показывая пользователю, какое он вводит число. Те, кто не смог разобраться, что именно делает эта срока, могут прочесть справку[здесь] (англ. яз.):
“-(IBaction)buttonOperationPressed:(id)sender”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | -(IBAction)buttonOperationPressed:(id)sender { if (currentOperation == 0) result = currentNumber; else { switch (currentOperation) { case 1: result = result + currentNumber; break; case 2: result = result - currentNumber; break; case 3: result = result * currentNumber; break; case 4: result = result / currentNumber; break; case 5: break; } } currentNumber = 0; calculatorScreen.text = [NSString stringWithFormat:@"%.2f",result]; currentOperation = [sender tag]; } |
При запуске приложения все значения “int” устанавливаются на “zero“. Поэтому при нажатии пользователем одной из отвечающих за операции кнопок отображаемое на “экране” число обрабатывается как результат, а идентификатор операции сохраняется в “currentOperation“. При последующих обращениях “currentOperation” запоминает нажатую кнопку действия и выполняет соответствующую операцию. Вот как это работает на практике:
1. пользователь вводит 123 и нажимает клавишу сложения
2. пользователь вводит 354 и нажимает клавишу вычитания
3. 123+354 = 477
4. пользователь вводит 10 и нажимает клавишу равенства
5. 477 - 10 = 467
“-(IBAction)cancelInput & -(IBAction)cancelOperation”
1 2 3 4 5 6 7 8 9 | -(IBAction)cancelInput { currentNumber = 0; calculatorScreen.text = @"0.00"; } -(IBAction)cancelOperation { currentNumber = 0; calculatorScreen.text = @"0.00"; currentOperation = 0; } |
Два приведенных выше метода практически аналогичны. Оба устанавливают в качестве “currentNumber” значение “zero“, меняя отображаемый на экране текст на 0.00. Единственное отличие в том, что “cancelOperation” устанавливает на ноль и значение для “currentOperation” (как если бы пользователь запустил приложение заново или нажал на клавишу равенства).
Кнопкой “Build and Go” запустите приложение — теперь калькулятор должен работать. Это элементарный проект, в котором разрешено деление на ноль и нет возможности вводить дроби, но, надеюсь, на основе вышеизложенного вы напишете полнофункциональный калькулятор с красивым интерфейсом. Комментируем, оцениваем.

И еще одна мелочь, которая на самом деле крайне важна — работа с памятью. В метод “dealloc” добавьте “[calculatorScreen release];“. Освобождать нужно только объекты, назначенные вами или редактором IB, включая “calculatorScreen“. Переменные типа “int“, “float“, “boolean” вас волновать не должны.

(3 голосов, средний: 4.67 из 5)
Май 23rd, 2009 at 16:42
Буквально пару дней назад написал такой же!=)
Май 24th, 2009 at 01:45
Ну вот) Можете поделиться опытом тогда))
Май 24th, 2009 at 18:18
Кста целесообразней объявить currentNumber не float, а например double, или ограничить ввод цифр, иначе после 8 цифры начинается бред, но это в принципе кому как надо)
Май 24th, 2009 at 21:36
Ну да, но этот урок как концепт как бы, для будущих побед)
Июнь 3rd, 2009 at 08:52
отличная статья !!! +5
Июнь 3rd, 2009 at 08:53
когда еще будут новенькие !!!???? а то это уже перепробувал!
Август 9th, 2009 at 12:58
Не понятно с тэгами кнопак. как выставить?
Август 9th, 2009 at 13:04
Прошу прощения, нашел… сотрите плиз мои жалобы