Руководство по разработке в IOS: Интерфейс — Часть 2

В первой части нашего руководства, предназначенного для желающих начать программировать для iOS (iOS tutorial), мы кратко рассмотрели процесс разработки приложения для iPhone и познакомились с Xcode.

Сегодня перейдем к второй части руководства и опишем процесс создания полностью функционального приложения для iPhone с навигацией посредством вкладок для конвертации единиц измерения температуры и расстояния. Не беда, если вы плохо знаете Xcode, вы быстро привыкнете к интерфейсу. К тому же каждый шаг будет детально описан.

Результатом урока будет приложение, которое не может быть запущено на iPhone, поскольку для этого необходимо купить программу для разработчиков, но его можно запустить в iOS Simulator под Mac OS X. Вы также можете скачать файлы проекта, чтобы сверяться с ними в случае сомнений по поводу каких-либо шагов. Итак, наша цель – создать приложение.

Примечание: Для работы с Xcode необходимо иметь компьютер с Macintosh Operating System (Mac OS), на Windows делать это легально нельзя.
Pre-Setup: установка Xcode Packages
Если у вас еще нет Xcode 4, нужно его установить (в этом руководстве речь идет именно об этой версии). Если ОС вашего компьютера — Mac OS X Lion, найти Xcode 4 проще всего в App Store. В Xcode входит 4 iOS SDK & Simulator для разработки и запуска приложений для iPhone прямо на компьютере.

Также Xcode 4 можно скачать на официальной странице, либо можно найти его в вашем аккаунте разработчика, который можно бесплатно зарегистрировать на сайте Apple Developer.

Если не получилось, воспользуйтесь Google. Apple старается держать высокую плануку для разработчиков, поэтому подготовиться к разработке может быть нелегко. К счастью, достаточно установить только Xcode, в котором есть все необходимые средства разработки под iPhone.
После завершения установки запускайте Xcode и приступим к работе.

1. Создание нового проекта

Запустите Xcode 4, появится стартовый экран с несколькими параметрами по умолчанию. Выберите Create a new Xcode project, чтобы открыть главное окно. Здесь предлагается выбор шаблона. Мы используем Tabbed Application.

Нажмите Next, после этого нужно ввести название проекта. Назовём наш проект Converter. Затем необходимо ввести Company Identifier, например, com.hongkiat, который используется для сортировки внутренних директорий приложения. Выберите iPhone в Device Family и отметьте галочками все опции ниже. Нажмите next и выберите, где будут размещены файлы проекта.

В левой панели вы увидите Project Navigator с новыми файлами. Кликните на Converter, чтобы просмотреть все находящиеся внутри файлы. Рядом с Project Navigator располагается Document Outline. Запомните эти названия, поскольку они будут использоваться в этом руководстве.

На папки на картинке не обращайте внимания. Это лишь пример для отображения структуры рабочей поверхности xCode.1 — Project Navigator; 2 — Interface Builder Editor; 3 — Utilities ; 4 — Тулбар ; 5 — Document Outline

Необходимо обратить внимание на три очень важных файла: MainStoryboard.storyboard, FirstViewController.h и FirstViewController.m. Файлы с расширениями .h и .m используются для заголовка и кода реализации, который связывает back-end программирование с front-end кнопками и текстовыми полями интерфейса. Также вы должны увидеть соответствующие файлы SecondViewController.h и SecondViewController.m для Second View.

Примечание: Front-end — часть программы, которая взаимодействует с пользователем. Back-end —внутренняя, невидимая пользователю, её часть.

Storyboard-файл первоначально был .xib-файлом, который был портирован из Interface Builder. В последнем релизе Xcode 4.2 эта функциональность сведена в подобие блок-схемы для упрощения процесса редактирования. При создании нового проекта можно отменить опцию storyboard , и вы получите отдельные .xib-файлы для каждого вида. Если вам удобно — используйте старую систему, а в этой статье мы будем всё-таки придерживаться именно storyboard-метода.

2. Работа с иконками панели вкладок

Начнем с создания компонентов интерфейса, а к программированию на Objective-C вернемся позднее. Прежде всего скачайте набор иконок Glyphish. Они предлагают дополнительно набор иконок высокого разрешения для iPhone 4 с дисплеем Retina, хотя мы можем использовать стандартные.

В Xcode в Project Navigator правым кликом откройте первую желтую папку, и выберите Add files to Group…. Group — это имя проекта, в нашем случае — Converter.

Откроется новое окно, в котором нужно выбрать файлы, которые мы добавим в Xcode. Выберите Glyphish Icon, а из файлов иконок выберите 61-brightness.png. Кликните Add, и он добавится в директорию проекта. Таким же образом добавьте 07-map-marker.png.

Теперь выберите MainStoryboard.storyboard, чтобы открыть визуальный редактор в центральной части программы. Справа от Project Navigator появится меню Document Outline. Это документированный список всех страниц, элементов, видов и навигации приложения.

Перед тем, как добавлять иконки, нам потребуется использовать еще одно меню, Utilities. Его панель по умолчанию включена, вручную это можно сделать, выбрав View > Utilities > Show Utilities в верхней панели меню.

Возвращаясь к Document Outline, обратим внимание на то, как в First View и Second View увидеть площадку сцен (scene box) и контроллер вида.
Кликните на левую стрелку First View Controller – First. Появятся элементы, в том числе Tab Bar. Выберите его (если ничего не отображается, попробуйте сделать скролл вправо). Все изменения во вкладках будут производиться в Attributes Inspector, он вызывается по View > Utilities > Show Attributes Inspector.

Теперь переведите взгляд на панель Utilities в правой части редактора. Там под Tab Bar находятся опции Title и Image. Откройте Image, 61-brightness.png, иконка будет присвоена Tab Bar’у для First View. Также можно удалить название из Tab Bar, тогда под иконкой не будет текста.
Для работы с Second View можно вернуться к Document Outline и открыть Second View Controller – Second, отобразится Tab Bar – Second. Кликните по Tab Bar Item – Second и найдите на панели в правой части редактора Title и Image. Откройте Image option, выберите 07-map-marker.png, иконка будет привязана к Tab Bar’у для Second View. Удалите название Tab Bar.

3. Дизайн видов с объектами

Завершив импортирование и установку изображений, перейдем к дизайну видов. Мы:

a) сделаем дизайн First View;
b) скопируем все элементы из First View и вставим в Second View;
c) сделаем в Second View некоторые изменения.

Для всех видов по умолчанию даны текстовый заголовок (text header) и расшифровка (description object). Дважды кликните на текст First View в контроллере First View и измените его на Temp Converter(напомню, Converter — имя нашего проекта). Повторите те же действия с контроллером Second View и поменяйте текст на Distance Converter. Чтобы изменить шрифт, его цвет, размер и т. д., нужно выбрать текст и перейти в Attributes Inspector , панель Utilities.

Для расшифровки под заголовком в контроллере First View, можно дважды кликнуть по тексту и дать описание действий для каждого вида, например, «Введите значение для конвертации из градусов Фаренгейта в Цельсия». Повторим те же действия относительнотроллера Sec Controllerond View, но описание будет «Введите значение для конвертации миль в километры и астрономические единицы».

Теперь нужно создать поле для ввода числа. В нижней части панели Utilities расположена библиотека Objects, которую также можно открыть так: View > Utilities > Show Object Library. В выпадающем меню выберите Controls, затем Text Field, и перетащите в контроллер First View.

Расположите поле посередине. Изменить размер можно кликнув по нему. В Attributes inspector (панель Utilities) также можно изменить цвет текста в окне ввода. Теперь добавьте “Enter temperature…”, в поле Placeholder (не в поле Text).

Теперь немного поработаем над тем, чтобы сделать интерфейс более дружественным. Найдите на панели Utilities пункт Clear Button (Кнопка очистки) и поменяйте значение с Never appears на Appears while editing. Это позволит удалять всю запись целиком не нажимая крестик удаления X несколько раз.
Затем на той же панели найдите пункт Keyboard (клавиатура) с выпадающим меню. Изменим его с Default на Number Pad чтобы можно было вводить только цифры.

Теперь нужно создать кнопку, после нажатия на которую происходила бы конвертация. Перетащите круглую кнопку с квадратом внутри из Object Library, расположенной в нижней части панели Utilities и разместите ее под текстовым полем, дважды кликните и впишите Convert!. Опять же, с помощью Attributes inspector можно поменять стиль, хотя и по умолчанию все выглядит неплохо.

Для того, чтобы управлять текстом, который выдается после конвертации, нужно перетащить Label object из Object Library в контроллер First View. При перемещении ярлыка для просмотра по умолчанию ему присваивается название Label. Текст нужно удалить, чтобы он не показывался при запуске приложения. Расширьте поле и разместите его под кнопкой Convert.

Перед тем, как перейти к контроллеру Second View, можно улучшить дизайн контроллера First View. Это лучше делать на данном этапе — когда мы будем дублировать элементы из контроллера First View в Second View не пришлось переделывать контроллер Second View. Можно сэкономить время, скопировав все из First View, но, поскольку функционал контроллера Second View отличается, нужно внести некоторые изменения.

Кликните View в контроллере Second View в панели Document Outline, в окне просмотра выделите все элементы и удалите их. Это удалит только текстовый заголовок и расшифровку (description object), Second View станет пустым. Теперь выделите все элементы в First View и нажмите cmd+c/cmd+v чтобы скопировать их в пустой Second View. Вот какие изменения объектов необходимо сделать в Second View:

  • заменить текстовый заголовок на “Distance Converter”;
  • текстовое поле — в Placeholder пишем “Enter distance…” и в Keyboard ставим “Number Pad”;
  • лейблы — добавьте еще один Label под существующим. Верхний Label будет отображать километры, а нижний – астрономические единицы.

Вот что должно получиться. Как видим, полученный Second View почти идентичен First View.

4. Программирование в First View

С графикой все, теперь перейдем к программированию. Можно начать с разработки функциональности бекенда для более простого First View. Выберите FirstViewController.h в Project navigator.

Нужно изменить код, дав интерфейс-названия (instance names) всем функциям и свойствам, которые мы используем. В FirstViewController.h вы увидите такой код:

#import <UIKit/UIKit.h>  

@interface FirstViewController : UIViewController  

@end
 

Замените его находящимся ниже. Ключевое слово @interface создает подкласс UIViewController, который является видом по умолчанию во всех приложениях в iOS.

#import <UIKit/UIKit.h>  

@interface FirstViewController : UIViewController {
	    UITextField *tempTextBox;
	    UILabel     *calcResult;
	}
@property (nonatomic, retain) IBOutlet UILabel *calcResult;
@property (nonatomic, retain) IBOutlet UITextField *tempTextBox;
- (IBAction)degreeConvert:(id)sender;
- (IBAction)backgroundTouchedHideKeyboard:(id)sender;
@end
 

Необходимо объявить IBOutlets (Interface Builder Outlets) для каждого элемента нашего приложения. Это то, что создает @property — новый аутлет («выход», поле класса, ссылающееся на элемент интерфейса) для Xcode, чтобы соединяться с интерфейсом. Также определим два действия, которые являются, выражаясь непрофессиональным языком, просто блоками кода, выполняющимися при каждом их вызове.
DegreeConvert берет значение из текстового поля и производит конвертацию градусов Фаренгейта в градусы Цельсия. BackgroundTouchedHideKeyboard добавим для того, чтобы клавиатура скрывалась, если пользователь касается фона.

Переходим к отличиям между файлами .h и .m. Мы обозначили все функции и переменные, но пока они ничего не делают и ничего не соединяют. Нужно реализовать функциональность в FirstViewController.m. Сохраните изменения и откройте FirstViewController.m в Project Navigator. Нужно создать a доступ к элементами соединения в шапке First Viewer. Это делает @synthesize, так что теперь наши действия могут влиять на различные объекты на экране
Добавьте @synthesize tempTextBox, calcResult; в FirstViewController.m, первые строчки будут выглядеть так:

#import "FirstViewController.h"  

@implementation FirstViewController
@synthesize tempTextBox, calcResult;

Здесь заявляются текстовое поле и лейбл результата соответственно. Далее взглянем на две функции, которые были написаны заранее. Если вы еще плохо знакомы с синтаксисом Objective-C, они могут показаться запутанными, но со временем вы привыкнете к такой структуре. Скопируйте этот текст в файл.

- (void)degreeConvert:(id)sender
{
double fahren = [tempTextBox.text doubleValue];
double celsius = (fahren - 32) / 1.8;  

[tempTextBox resignFirstResponder];  

NSString *convertResult = [[NSString alloc] initWithFormat: @"Celsius: %f", celsius];
calcResult.text = convertResult;
}  

- (void)backgroundTouchedHideKeyboard:(id)sender
{
[tempTextBox resignFirstResponder];
}

Сначала у нас есть degreeConvert, который не получает параметров и возвращает пустоту. Это метод, вызываемый при нажатии пользователем кнопки конвертации в First View. Переменная fahren получает значение из введенного пользователем. Другую, celsius, можно вычислить с помощью элементарных математических действий.

Теперь строка [tempTextBox resignFirstResponder] вызывает метод resignFirstResponder на нашей клавиатуре. Этот код также есть во второй функции backgroundTouchedHideKeyboard, что отвечает за отмену выбора текстового поля и скрывает клавиатуру после того, как пользователь касается фона или «нажимает» кнопку конвертации.
Остальное в функции degreeConvert создает новую строку/стрингу (NSString) для хранения конвертации Цельсия и использования синтаксиса точек, чтобы добавить его в поле лейбла. Если вы знакомы с языками, основанными на С (Java, PHP, C#/C++, Perl), некоторые из этих терминов могут быть вам знакомы.
Теперь найдите вот этот код:

- (void)viewDidUnload
{
[super viewDidUnload];  

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

Замените его следующим:

- (void)viewDidUnload
{
 [super viewDidUnload];  

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.tempTextBox = nil;
 self.calcResult = nil;
}

Внизу нашего FirstViewController.m создадим коллекцию переменных, которые написали. Мы должны освободить все различные подвиды из памяти, которые включают в себя текстовое поле или лейбл вывода. Автоматический подсчет ссылок (Automatic Reference Counting — ARC) должен автоматически обращаться к переменным из памяти, что сэкономит массу нервов

5.Соединяем действия и аутлеты

Это финальная стадия для First View, где мы соединим наши фрон-енд элементы и бек-енд код! При построении IOS-приложений, всегда есть три стадии — внешний вид, код и их соединение. Сейчас мы соединим все элементы First View и код, и заставим их работать!

Сохраните FirstViewController.h и FirstViewController.m, чтобы быть уверенными, что все обновлено. Затем перейдите в Document Outline, там — оранжевый шар, который должен называться First View Controller — First.

Кликните по нему, чтобы выбрать, и в First View должен появиться синий контур. Нажмите Ctrl и кликните First View Controller – First, перетащите на текстовое поле и отпустите.

После этого появится список «выходов» Outlets. Выберите в нем “tempTextBox”. Если соединение будет успешным, текстовое поле замигает.

Теперь нажмите Ctrl и снова кликните First View Controller – First, перетащите на Label field и выберите “calcResult”. Оба аутлеты теперь соединены с переменными и нуждаются с соединении с действиями.

Кликните правую стрелку на First View Controller – First, вы увидите пункт View — выберите его, откройте Identity inspector на панели Utilities (также его можно найти в верхнем меню вкладок, выбрав View > Utilities > Show Identity Inspector). В разделе Custom Class введите UIControl или выберите его из выпадающего меню.

Чтобы клавиатура распознавала фон как объект, по которому возможно «тапать», его нужно конвертировать в элемент управления. В панели Utilities активируйте Connections inspector (в верхнем меню вкладок выберите View > Utilities > Show Connections Inspector).

Таким образом, мы связываем событие на странице (перелистывание, тап, удержание, и т. д.) и одиночный вызов функции. Найдите в списке событий Touch Down. Нажмите маленький кружок, расположенный в правой части этого события и перетащите его в контроллер First View. Будут предложены два действия, выберите TouchedHideKeyboard, появится мигание.

И, наконец, выберите кнопку Convert и убедитесь, что она подсвечена синим как на скриншоте, но без выбора всего View Control. В Connections Inspector перетащите маленький кружок Touch Up Inside в контроллер First View. Выберите функцию degreeConvert, которая будет запускаться только если пользователь «нажимает» и «отпускает» кнопку в пределах установленных границ.

6. Перенос кода в Second View

Теперь сохранитесь и скомпилируйте приложение. Если все сделано правильно, после ввода значений в текстовое поле и нажатия соответствующей кнопки программа должна выдавать корректный результат в градусах Цельсия. Если же выдает ошибки, попробуйте скачать демо-проект в конце статьи, сравнить и исправить ошибки.
Итак, Second View мы создали чуть раньше, и сейчас будем с ним работать. Наш Second View будет выдавать не один результат конвертации (из градусов Фаренгейта в Цельсия), а два: из миль в километры и астрономические единицы. Для этого нужно перенести код в Objective-C из First View и внести изменения чтобы он правильно заработал в Second View, затем связать все элементы.
Начнем с хедер-кода, затем займемся реализацией. Ниже добавлен код из файла SecondViewController.h. По большей части он идентичен хедером контроллера First View, но с дополнительным свойством, связанным со вторым элементом UILabel.

Найдите в SecondViewController.h следующее:

#import <UIKit/UIKit.h>  

@interface SecondViewController : UIViewController  

@end

Замените на этот код:

#import

@interface SecondViewController : UIViewController {
	    UITextField *distTextBox;
	    UILabel     *distResult;
	    UILabel     *auResult;
	}
@property (nonatomic, retain) IBOutlet UILabel *distResult;
@property (nonatomic, retain) IBOutlet UILabel *auResult;
@property (nonatomic, retain) IBOutlet UITextField *distTextBox;
- (IBAction)distanceConvert:(id)sender;
- (IBAction)backgroundTouchedHideKeyboard:(id)sender;
@end

Как видите, я заменил все имена инстанс для действий и аутлетов. DistTextBox теперь будет держать введенную цифру расстояния. DistResult это лейбл первого расстояния (километры), а auResult будет содержать 2й лейбл, лейбл ковертирования. distanceConvert это новое действие, которое вызывается для конвертирования числового значения, а backgroundTouchedHideKeyboard остается тем же.

Как и ранее, мы используем иерархию MVC для разделения функций приложений от контроллера между объектами сториборд. Если ваш SecondViewController.h выглядит так же, как и на примере, сохраните изменения и выберите SecondViewController.m. Также разобьем код на две части.
Код ниже — из верхней части SecondViewController.m. Он содержит оператор @synthesize для создания методов установки и получения каждой инстансной переменной. Принцип синтеза инстансных переменных поначалу может быть непонятным, в этом случае для его лучшего понимания попробуйте ознакомится с этим обсуждением: StackOverflow (англ)

Теперь взгляните код в SecondViewController.m:

#import "SecondViewController.h"  

@implementation SecondViewController

Замените его на этот код:

#import "SecondViewController.h"  

@implementation SecondViewController
@synthesize distResult, auResult, distTextBox;  

- (void)distanceConvert:(id)sender
	{
	    double miles = [distTextBox.text doubleValue];
	    double km = miles * 1.61;     // multiply miles by ~1.609 kilometers
	    double au = miles / 92956000; // divide miles by 92,956,000AU  

	    [distTextBox resignFirstResponder];  

	    NSString *kiloResult = [[NSString alloc] initWithFormat: @"Kilometers: %f", km];
	    NSString *ausResult = [[NSString alloc] initWithFormat: @"AUs: %f", au];
	    distResult.text = kiloResult;
	    auResult.text = ausResult;
	}  

- (void)backgroundTouchedHideKeyboard:(id)sender
	{
	    [distTextBox resignFirstResponder];
	}
 

Новое действие distanceConvert будет вызываться при нажатии пользователем кнопки Convert. Переменная miles будет брать число из distTextBox, а km и au производить математические действия для получения данных. После этого, используя 2 линии мы выделяем память для для двух объектов NSString, удерживающих информацию о километрах и АЕ. Используя точечный синтаксис, мы вызываем свойство .text для изменения текста UILabel.
Теперь найдите следующий код:

- (void)viewDidUnload
{
 [super viewDidUnload];  

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

Замените на этот:

- (void)viewDidUnload
{
 [super viewDidUnload];  

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.distResult = nil;
self.auResult = nil;
self.distTextBox = nil;
}

И последний фрагмент кода, он находится в самом конце SecondViewController.m. После того, как view cкомпилирован и отображается, вызывается viewDidUnload. Мы установим три свойства, синтезированные ранее в nil (null в Objective-C) и освободим их инстансу из памяти. Приложение почти готово, осталось соединить сториборд с аутлетами и действиями.

7. Соединение Second View

Процесс простроение видов представляет собой повтор пятого шага с некоторыми дополнительными действиями. Можно использовать это как тренировку памяти на соединении сториборда с аутлетами и действиями, тем более что с ними часто возникают затруднения. Как обычно, сохраните SecondViewController.h и SecondViewController.m чтобы быть уверенным, что все обновлено. Затем перейдите обратно в сториборд и найдите в Document Outline оранжевый шар, который должен называться Second View Controller — Second.

Кликните по шару, сцена Second View должена выделиться синим контуром. Теперь нажмите Ctrl и кликните по Second View Controller — Second, перетащите его в текстовое поле и отпустите.

После этого появится список Outlets, выберите “distTextBox”. Если соедиенение успешно, тестовое поле будет мигать.

Затем нажмите Ctrl и кликните Second View Controller — Second, перетащите в поле Label и выберите distResult. Повторите те же действия со 2м лейблом, расположенным под первым, выбрав auResult. Оба наших аутлета теперь соединены со своими переменными и теперь их нужно присоединить к действиям.

Кликните по правой стрелке в Second View Controller — Second, затем — по компоненту View. Через панель Utilities откройте Identity inspector (также его можно открыть через главное меню вкладок > View > Utilities > Show Identity Inspector). B Custom Class введите или выберите из выпадающего меню UIControl.
Чтобы фон распознавался клавиатурой как объект, по которому возможно «тапнуть», его нужно конвертировать в элемент управления. Активируйте Connections inspector (через панель Utilities или верхнее меню вкладок > View > Utilities > Show Connections Inspector).

Таким образом мы связываем событие на странице (перелистывание, тап, удержание, и т.д.) и вызов отдельной функции. Найдите в списке событий Touch Down. Нажмите маленький кружок, расположенный в правой части Touch Down event и перетащите его в Second View Controller. Будут предложены два действия, выберите backgroundTouchedHideKeyboard, появится мигание.

Кликните кнопку Convert, она должна поменять цвет на синий как на скриншоте, но без выбора всего View Control. В Connections Inspector перетащите маленький кружок Touch Up Inside в контроллер Second View. Выберите функцию distanceConvert, которая будет запускаться только если пользователь «нажимает» и «отпускает» кнопку внутри определенной области.
Теперь сохранитесь и скомпилируйте приложение. Если ошибок нет, все должно работать и можно заняться мелкими улучшениями — изменить текст, шрифт, или, например, поменять PNG логотипа.
Спасибо за использование этого руководства и мои поздравления — вы только что создали свое первое приложение для iPhone!
Что-то не получается? Вот файл для тестирования .

Заключительные слова

В заключение будет полезно сделать краткий обзор ключевых моментов руководства. Итак, мы поставили перед собой задачу создать приложение для iPhone c навигацией вкладками: 2 UIViews, которые мы дополнили текстовым полем, кнопкой и лейблами. Затем мы написали код на Objective-C для определяющих инстансных переменных (ivars) и действий (экшены, функции чтобы обрабатывать числа для конвертации.
Наконец, мы соединили объекты для каждой инстансной. Это позоляет бэк-енд коду Objective-C нацеливаться на ID, такие как tempTextBox, и связать его в сториборд-объекте.
Надеюсь, вы подметили много ключевых слов и нюансов работы Xcode. Хотя вряд ли вы станете экспертом в разработке приложений iOS, скорее всего, многие аспекты будут для вас непонятны. Но! Программирование для iOS — это прежде всего практика, так что ничего страшного, если поначалу вы не все понимаете. Скачайте файл демо-проекта, ссылка на который была выше и просмотрите его, это поможет лучше понять данное руководство и Xcode в целом.

И один совет напоследок: никогда не сдавайтесь!

по мотивам

Читателям также нравится:

Обратите внимание!

Запущена новая версия сообщества для творческих людей — TopCreator, которое мой блог всячески поддерживает. Мы верим, что проект нужен российским дизайнерам, иллюстраторам и фотографам — мы хотимы быть вам полезны! Очень интересный проект, будьте среди первых. Заходите сюда

Комментарии

  1. 12 Янв
    Игорь

    Очень полезная статья.
    Сам разбираюсь с программированием под XCode. Все так не привычно… Поэтому здорово, что есть такие мануалы.

  2. 07 Фев
    Павел

    статья мегаполезная!
    но:
    делая все по мануалу я получил фэйл в итоге ибо мои файлы с разрешением m — очень сильно не совпадали в плане кода, хотя копировал я вроде бы все как написано

  3. 07 Фев
    naikom

    @Павел
    Попробуйте проверить по оригиналу статьи, возможно, я где-то что-то упустил (?)

  4. 15 Окт
    Олег

    Статья стала просто бесполезной и бесячей именно во второй части. Не понятен принцип действия этого убогого xcode. Типа скопируй код- это не научит. Надо объяснить почему для суперпростой программы надо сделать столько неясных телодвижений Па чи му???)

  5. 16 Ноя
    Кука

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

  6. 21 Ноя
    Alex

    А потому что, господа, не надо всегда всем верить. Когда кто-то говорит, что программировать не сложно, и можно даже не брать в расчет язык, могу вам сказать — это чушь. Если у вас нет представления об ООП, то дальше калькулятора вряд ли уедете. Учите матчасть как говорится…

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

Anti-Spam Protection by WP-SpamFree


  • Kevin Durant Shoes
  • Lebron Shoes
  • Lebron James Shoes
  • Nike Lebron James Shoes
  • Derrick Rose Shoes
  • D Rose Shoes
  • KD 7 Shoes
  • Kobe X Shoes
  • Kobe 10 Shoes
  • KD 7
  • Kevin Durant Shoes
  • KD Shoes
  • Nike KD Shoes
  • Kobe 10 Shoes
  • Discount Kobe Shoes
  • Kobe Shoes
  • Kobe Bryant Shoes
  • KD 7 Shoes
  • Kyrie Irving Shoes
  • Lebron 12
  • Lebron James Shoes
  • Lebron Shoes
  • Nike Free
  • Nike Free Run
  • Air Max Shoes
  • Cheap Air Max Shoes
  • Lebron James Jersey
  • Kobe Bryant Jersey
  • Kevin Durant Jersey
  • Air Jordan Shoes
  • Michael Jordan Jersey
  • Blake Griffin Shoes
  • Russell Westbrook Shoes
  • Rose Shoes
  • Kobe Bryant Jerseys
  • Lebron James Jerseys
  • Kobe Bryant Jersey
  • Lebron James Jersey
  • Supra Shoes
  • Kyrie 1 Shoes
  • Nike Free 5.0
  • Nike Free 5
  • kevin durant shoes
  • kd 7
  • kd new shoes
  • KD Shoes
  • Kyrie 1
  • Jeremy Scott shoes
  • Jeremy Scott Adidas
  • Tenis Adidas Springblade
  • Kevin Durant Shoes
  • Kobe Bryant Shoes
  • KD Shoes Store
  • KD Sneakers
  • Lebron Basketball Shoes
  • Adidas Porsche Design
  • kd shoes
  • Cheap Herve Leger Dress
  • Cheap Lebron Shoes
  • Adidas Porsche Design
  • Lebron James Shoes
  • Coach Retail Store
  • nba jerseys
  • louis vuitton handbags
  • Cheap Lebron 11
  • Kobe Bryant Shoes
  • Kevin Durant Shoes
  • louis vuitton belts
  • kobe shoes
  • Lebron James Shoes
  • Kevin Durant Shoes
  • Los Angeles Clippers Jerseys
  • Toronto Raptors Jerseys
  • kd 6
  • kd 7
  • kobe 9
  • Kyrie 1
  • Nike Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving 1
  • KD Shoes
  • Lebron James Shoes
  • KD 7
  • Westbrook Shoes
  • Lebron Shoes
  • Lebron James Shoes
  • Air Max Shoes
  • kobe bryant shoes
  • Derrick Rose Shoes
  • Rose Shoes
  • KD 7
  • Kobe X
  • Kobe 10
  • Lebron Shoes 12
  • kyrie irving shoes
  • Nike KD Shoes
  • Cheap Nike Free
  • Nike Free
  • Lebron 12 Shoes
  • Cheap Air Max
  • Cheap Lebron Jerseys
  • Kobe Bryant Jerseys
  • Kevin Durant Jersey
  • Kobe Shoes
  • Griffin Shoes
  • Michael Jordan Jerseys
  • Kobe Jerseys
  • Lebron Jerseys
  • Kobe Bryant Jerseys
  • Lebron James Jerseys
  • Cheap Supra Shoes
  • Supra Shoes
  • Nike Kyrie 1
  • Nike Free Shoes
  • Nike Free Run
  • KD shoes
  • Kyrie 1 Shoes
  • Kevin Durant Shoes
  • Jeremy Scott Wings
  • Jeremy Scott Shoes
  • Lebron James Shoes
  • Adidas Porsche Design
  • Kobe Shoes
  • Cheap Kevin Durant Shoes
  • Kevin Durant Shoes
  • Lebron 11
  • Porsche Design Adidas
  • Cheap KD Shoes
  • Lerbon James Sneakers
  • Cheap KD Shoes
  • Herve Leger Dress
  • Lebron Shoes
  • Porsche Design Shoes
  • Lebron Shoes
  • Nike Shoes
  • Cheap Coach Bags
  • louis vuitton purses
  • cheap nba jerseys
  • Lebron James Shoes
  • Cheap Kobe Shoes
  • Kobe Shoes
  • KD Shoes
  • KD Shoes
  • Sacramento Kings Jerseys
  • Washington Wizards Jerseys
  • Air Jordan Shoes
  • kd 6
  • kd 7
  • kobe 9
  • Kyrie 1
  • Nike Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving 1
  • Lebron James Shoes
  • Lebron 12
  • Lebron 11
  • Kobe Shoes
  • cheap kobe shoes
  • lebron 12 shoes
  • James Shoes
  • Lebron Shoes
  • Rose Shoes
  • Derrick Rose Shoes
  • Kobe 9
  • NIke KD
  • KD VII
  • KD Shoes 2015
  • kyrie shoes
  • Air Max 90
  • Air Max Shoes Sale
  • Nike Free Shoes
  • Nike Free Run 2
  • Lebron 12
  • Lebron Jerseys For Sale
  • Cheap Kobe Jerseys
  • KD Jersey
  • Jordan Jersey
  • Jordan Griffin Shoes
  • Kobe Bryant Jersey
  • Lebron James Jersey
  • Supra Footwear
  • Supra Shoes
  • KD Shoes
  • Kyrie irving Shoes
  • Nike Free Run Shoes
  • nike free run 5.0 women
  • KD Shoes
  • Kyrie Irving Shoes
  • Kevin Durant Shoes
  • KD Shoes
  • Kobe Shoes
  • Kobe Shoes
  • Adidas Wings
  • Kobe Bryant Shoes
  • Porsche Design Adidas
  • Cheap Kobe Shoes
  • KD 6
  • Cheap Westbrook Shoes
  • Kevin Durant Shoes
  • Adidas Porsche Shoes
  • Cheap Lebron James Shoes
  • Kevin Durant Shoes
  • Herve Leger Outlet
  • Lebron James Shoes
  • Adidas Porsche Design Bounce
  • Nike Lebron Shoes
  • Coach Outlet
  • nba jerseys for sale
  • louis vuitton bags
  • Air Jordan 29
  • Nike Lebron Shoes
  • Nike Kobe Shoes
  • Cheap Kobe Shoes
  • Cheap KD Shoes
  • KD 6
  • Utah Jazz Jerseys
  • Philadelphia 76ers Jerseys
  • Air Jordan Shoes
  • kd 6
  • kd 7
  • kobe 9
  • Kyrie 1
  • Nike Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving 1
  • Cheap Lebron Shoes
  • Lebron New Shoes
  • James Shoes
  • Cheap Lebron 11
  • Lebron James Shoes
  • KD 7
  • Adidas Rose Shoes
  • Rose 5
  • NIke KD 7
  • irving shoes
  • KD Shoes
  • Kobe 9
  • Air Max 95
  • Air Max 2014
  • Nike Free 3.0
  • Nike Free Run 3
  • lebron shoes for sale
  • kobe 2014
  • Cheap Lebron James Shoes
  • Kobe Jerseys
  • Kevin Durant Jerseys
  • Jordan Jerseys
  • Cheap Griffin Shoes
  • Jordan Westbrook Shoes
  • Kobe Jersey
  • Lebron Jersey
  • Supra Online
  • Supra Shoes
  • Kyrie 1
  • Irving Shoes
  • Kyrie Shoes
  • Nike Kyrie 1
  • KD Shoes 2015
  • Kobe Shoes 2015
  • Kobe Shoes 2015
  • Kevin Durant Shoes
  • Nike KD Shoes
  • Nike Kobe Shoes
  • Nike Kobe Shoes
  • Adidas Jeremy Scott
  • Adidas Jeremy Scott
  • KD Shoes
  • Adidas Springblade Shoes
  • Kevin Durant Shoes
  • nba jerseys 2015
  • Porsche Design Shoes
  • KD 6
  • KD Shoes Sale
  • Lebron James Shoes
  • Lebron James Shoes
  • Cheap KD Basketball Shoes
  • Herve Leger Bandage Dress
  • Adidas Porsche Bounce Shoes
  • Cheap Lebron Shoes
  • Cheap Coach Handbags
  • Louis Vuitton Bags Women
  • louis vuitton outlet
  • Kobe Shoes
  • Cheap Jordan Shoes
  • Lebron Shoes
  • Lebron Shoes Sale
  • Kobe Shoes Sale
  • Kobe Bryant Shoes
  • Lebron James Shoes
  • KD 6 Shoes
  • Boston Celtics Jerseys
  • New Orleans Pelicans Jerseys
  • kd 6
  • kd 7
  • kobe 9
  • Kyrie 1
  • Nike Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving 1
  • Lebron James Shoes
  • Lebron 12
  • Cheap Lebron Shoes
  • Lebron Basketball Shoes
  • Cheap Lebron Shoes
  • D Rose Shoes
  • Rose 5.0
  • KD Shoes
  • kyrie irving shoes
  • Nike Air Max Shoes
  • Nike Air Max
  • Nike Free 5.0
  • Nike Free Womens
  • nike lebron 12
  • kobe shoes 2014
  • Cheap Lebron Shoes
  • KD 7 EP
  • KD 2014
  • Kevin Durant Shoes
  • Lebron Jerseys
  • Lebron James Jerseys
  • Kobe Bryant Jersey
  • Kobe Jerseys For Sale
  • Kobe Jerseys Sale
  • KD Jerseys
  • Cheap Jordan Jerseys
  • Hyperdunk Griffin Shoes
  • Westbrook Shoes 2015
  • Nike Kobe Jersey
  • Lebron Jersey For Sale
  • Nike Supra
  • Supra Shoes
  • Kyrie 1
  • nike free run 5.0 women
  • nike free run women
  • Cheap Kyrie 1
  • Cheap Kyrie Shoes
  • Kyrie Shoes 2015
  • Adidas Shoes
  • Lebron Shoes
  • Porsche Design Shoes
  • Kobe 8
  • KD Shoes
  • Cheap Kevin Durant Shoes
  • Lebron Shoes
  • nba jerseys 2014
  • kd Shoes nba
  • Herve Leger Bandage Dress
  • Nike Lebron 11
  • louis vuitton sale
  • Kobe Bryant Shoes
  • Air Jordan Shoes
  • Cheap Lebron James Shoes
  • Kobe Shoes Sale
  • Lebron Shoes
  • Miami Heat Jerseys
  • Los Angeles Lakers Jerseys
  • kd 6
  • kd 7
  • kobe 9
  • Westbrook Shoes Sale
  • Kyrie 1
  • Nike Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving 1
  • Cheap Lebron Shoes
  • Lebron James Shoes
  • Lebron James Shoes Sale
  • Lebron James Jerseys
  • Cheap Rose Shoes
  • Rose 5 Shoes
  • Nike Free 6.0
  • Nike Free Sale
  • Kyrie Shoes Sale
  • KD Shoes
  • Air Max 2014
  • Air Max 90
  • cheap lebron shoes
  • lebron shoes
  • Lebron James Jersey
  • Lebron Shoes
  • Cheap KD Jerseys
  • Kevin Durant Jersey For Sale
  • Kobe Shoes
  • Jordan Jersey sale
  • Jordan Blake Griffin Shoes
  • Russell Westbrook Shoes Sale
  • official supra shoes
  • Porsche Design Shoes
  • Cheap Jeremy Scott Wings
  • Kobe Shoes sale
  • Lebron Shoes
  • Herve Leger Sale
  • nba jerseys sale
  • Coach Wallets
  • cheap louis vuitton handbags
  • Air Jordan
  • Nike Lebron Shoes Sale
  • Kobe 9
  • Kyrie 1
  • Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving Shoes
  • Irving Shoes
  • nike free run 5.0 men
  • nike free shoes on sale
  • Supra Shoes
  • LV Handbags Men
  • Kevin Durant Shoes
  • KD VI
  • Adidas Shoes
  • San Antonio Spurs Jerseys
  • Chicago Bulls Jerseys
  • kd 6
  • kd 7
  • kobe 9
  • Kyrie 1
  • Nike Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving 1
  • Kevin Durant Shoes
  • Lebron Shoes Sale
  • Lebron Shoes 2015
  • Lebron 12
  • Lebron James Shoes
  • Rose New Shoes
  • Rose Shoes 2015
  • Lebron Shoes 2015
  • Lebron 12
  • Lebron Jerseys sale
  • Nike kyrie shoes
  • Adidas Derrick Rose
  • Adidas Store
  • Adidas Shoes
  • Adidas Derrick Rose
  • lebron james shoes
  • Nike Kyrie Shoes
  • Kyrie irving Shoes For Sale
  • Lebron James Jersey
  • Kobe Bryant Jerseys
  • Kobe Jerseys For Sale
  • Kobe Jerseys Sale
  • Supra Shoes
  • Russell Westbrook Shoes
  • Kobe Jersey Sale
  • Cleveland Cavaliers Lebron Jersey
  • OKC Jersey
  • Nike Lebron Shoes
  • Lebron James Basketball Shoes
  • Kevin Durant Shoes
  • Herve Leger Bandage
  • Griffin Shoes Sale
  • nba jerseys store
  • Lebron Shoes 2014
  • cheap louis vuitton bags
  • Cheap Kobe Jersey
  • Lebron Jersey 23
  • Jordan Shoes
  • official nba jerseys
  • NBA Stars Basketball Shoes
  • KD Shoes
  • Air Max Shoes 90
  • Air Max 95
  • KD 2014 Shoes
  • KD For Sale
  • Nike Shoes
  • Nike Free
  • Kyrie 1
  • Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving Shoes
  • Irving Shoes
  • Phoenix Suns Jerseys
  • Customized NBA Jerseys
  • Jordan Shoes
  • kd 6
  • kd 7
  • kobe 9
  • Bulls Jordan Jersey
  • Kyrie 1
  • Nike Kyrie 1
  • Kyrie 1 Shoes
  • Kyrie Irving 1