The Moron Test - просто следуйте инструкциям… Уроки iPhone SDK: Эксперементируем с панелью состояния (”Status Bar”)
Май 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 кнопок и метку, разместив, как показано ниже:

calculatorview-206x299

Не забудьте отрегулировать размер метки “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 для равенства. Ноль — тэг по умолчанию, поэтому вводить его вручную необходимости нет.

tagbutton1-300x2431

tagbuttonx-300x244

Теперь выделите в файле “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“.

calcconnections

В редакторе 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” запустите приложение — теперь калькулятор должен работать. Это элементарный проект, в котором разрешено деление на ноль и нет возможности вводить дроби, но, надеюсь, на основе вышеизложенного вы напишете полнофункциональный калькулятор с красивым интерфейсом. Комментируем, оцениваем.

calculatorsimulator

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

Исходный код скачать можно [здесь]

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 4.67 из 5)
Загрузка ... Загрузка ...


8 Responses to “Уроки iPhone SDK: Создаем простой калькулятор.”

  1. 1. Рома Says:

    Буквально пару дней назад написал такой же!=)

  2. 2. Artem Says:

    Ну вот) Можете поделиться опытом тогда))

  3. 3. Рома Says:

    Кста целесообразней объявить currentNumber не float, а например double, или ограничить ввод цифр, иначе после 8 цифры начинается бред, но это в принципе кому как надо)

  4. 4. Bloshka Says:

    Ну да, но этот урок как концепт как бы, для будущих побед)

  5. 5. ARtt Says:

    отличная статья !!! +5

  6. 6. ARtt Says:

    когда еще будут новенькие !!!???? а то это уже перепробувал!

  7. 7. max3z Says:

    Не понятно с тэгами кнопак. как выставить?

  8. 8. max3z Says:

    Прошу прощения, нашел… сотрите плиз мои жалобы :)

Оставьте комментарий