GUI и «кокао»: Создаем оконные приложение для Mac OS XВ прошлый раз ты познакомился с созданием простых консольных приложений для Mac OS X с помощью языка Objective-C и фреймворка Cocoa. Но, конечно, гораздо лучше иметь в своих приложениях полноценный графический интерфейс. В этот раз мы поговорим о создании GUI-приложений с помощью все тех же Cocoa и Objective-C. XCodeЕсли ты читал предыдущую статью или уже пробовал кодить под макось, то наверняка познакомился с XCode, стандартной средой разработки под Mac OS X от Apple. Эта среда содержит все, что тебе может потребоваться для кодинга: редактор, компилятор, отладчик и т.д. Для создания графического интерфейса там есть специальная тулза под названием Interface Builder. Да, именно так – до XCode 4 Interface Builder существовал в виде отдельного приложения, что было довольно-таки неудобно, поэтому в четвертой версии XCode Apple интегрировала Intefrace Builder в свою IDE, и теперь ковать железо можно, не отходя от кассы. К сожалению, XCode 4 на данный момент (на момент сдачи статьи – конец сентября – прим. ред.) находится в фазе тестирования, и в свободном доступе ее нет, поэтому все сказанное ниже относится к XCode и Interface Builder третьей версии. Давай для начала попробуем создать простое GUI-приложение под макось с помощью всего этого хозяйства. Сначала был проектКаждый программный продукт в современном мире начинается с создания проекта для той среды, в которой он будет дальше развиваться. Проект – это, как ты знаешь, собрание разнообразных элементов, которые используются для построения приложения: исходных файлов, файлов с описанием пользовательского интерфейса, звуков, изображений, ссылок на используемые фреймворки и библиотеки и т.д., и т.п. Самый распространенный тип программного продукта, который создается с помощью XCode – это, конечно, приложения. Но приложения – не единственное, что ты можешь создать с помощью этой IDE. Кроме него, можно собрать, например, command-line тулзу, фреймворк, плагины, библиотеки и расширения ядра – kext'ы, а также приложения для iOS. Попробуем проследить создание приложения в XCode от начала и до конца. Первое, что нам потребуется – это, как ты уже догадался, создать проект. Для этого запусти XCode (если в твоей системе XCode не установлена, ты можешь безвозмездно скачать ее с сайта Apple). Для того, чтобы создать новый проект, идем в главное меню File -> New Project. Как видишь, здесь таится множество разных типов проектов. Нам потребуется Cocoa Application – оконное приложение, использующее фреймворк Cocoa. После того, как ты выберешь шаблон для проекта и место его расположения, XCode создаст файлы проекта и даже напишет за тебя пару строчек кода. Точка входа нашего приложения Нам здесь интересен вызов функции NSApplication. После передачи управления этой функции приложение входит в цикл обработки сообщений от системы. Такое «пассивное» поведение тулзы (ожидание оповещения от системы) – стандарт для современных многозадачных систем. Если ты попробуешь собрать и запустить этот проект (Build -> Build and Go), то увидишь пустое окошко. Откуда оно взялось? Ведь никакого кода для его создания мы не писали? Посмотри на файлы нашего проекта. Среди них в смарт-группе NIB Files (все файлы приложения разделены на так называемые смарт-группы. NIB Files – это файлы того самого Interface Builder’a) есть MainMenu.xib. Открываем его двойным кликом и попадаем в Interface Builder, где видим то самое окошко и еще главное меню нашего приложения, которое при запуске приложения в Mac OS X находится вверху экрана. ОК. Теперь поработаем немного в IB и накидаем на эту форму контролов. Строим интерфейсДавай разберемся, как изменить внешний вид главного окна нашей программы. Идем в Tools -> Library (заметь, что теперь главное меню изменилось, так как мы находимся не в XCode, а в Interface Builder’е) и видим всевозможные контролы, которые ты можешь разместить на своей форме простым dran-and-drop'ом. Я кину на окно три текстовых поля, пару статических текстовых полей и одну кнопку. Сделаем простой калькулятор, который при нажатии на кнопку складывает значения из двух текстовых полей и выводит результат в третьем. Надо же с чего-то начинать :). Для настройки контролов используется «инспектор объектов» (Tools -> Inspector). В его окошке отображаются свойства выделенного контрола, и их можно редактировать. Так, с помощью инспектора я задал тайтл кнопки и окна. Ну, хорошо. Интерфейс у нас есть, и если мы соберем и запустим проект, то увидим на экране форму такой, какой мы ее создали с помощью Interface Builder’а. Ну а как же логика работы нашего приложения? Как создать обработчики для событий, приходящих от контролов, и изменять внешний вид нашего приложения в коде? А вот тут-то и начинается самое интересное... Нам нужно интегрировать наш интерфейс и приложение. Для этого создадим класс-контроллер окна. Этот класс будет содержать обработчики сообщений от контролов формы и изменять их вид. Идем опять в XCode (не забыл, что мы все это время работали в Interface Builder’е?) и там создаем класс с именем AppConroller (File -> New File -> Cocoa -> Objective-C class). XCode создаст для нас два файла AppController.h и AppController.m с интерфейсом и реализацией класса-контроллера соответственно. Есть одна проблемка – Interface Builder о нашем классе AppController ничего не знает, а мы ведь должны будем привязать объекты интерфейса к полям и методам AppController’а. Перетаскиваем AppController.h на главное окно InterfaceBuilder. Теперь порядок. Но чего-то все-таки не хватает. Ага! Класс есть, а объекта этого класса нет ни одного. Идем в Interface Builder -> Tools -> Library -> Object и перетаскиваем объект с палитры на главное окно билдера. С помощью инспектора сообщаем билдеру, что это – объект класса AppController. Теперь вся необходимая информация есть в MainMenu.xib, и при старте нашего приложения среда выполнения, загрузив этот файл, содержащий описание интерфейса, создаст объект нашего класса и настроит его нужным образом. Наконец-то кодингПосле того, как с формошлепством покончено, настало время написать немного кода, который будет отвечать за поведение нашего приложения. Код класса AppController
Об идентификаторах IBOutlet и IBAction, которые присутствуют в коде нашего класса, нужно сказать отдельно. Это, собственно, Interface Builder Outlet (ссылка на элемент интерфейса) и Interface Builder Action – обработчик события, которое генерируется каким-то объектом GUI. Привязывать их к реальным объектам пользовательского интерфейса в коде не нужно, сделаем это, используя великий и могучий Interface Builder. Для этого:
Ну вот, наконец-то наше мегаприложение готово к работе. Жмем на «Build and Go» и видим следующее. Кстати, важный момент: методы и функции Cocoa не бросают исключения, поэтому не жди, что это приложение упадет, если ты вместо целого числа введешь строчку букв. Обработка некорректных значений в этом случае – задача программиста (но об этом в другой раз). Кварцевая графикаИтак, стандартные компоненты на форму мы с тобой кидать научились, и даже научились обрабатывать события от них и изменять их состояние из кода. Ну, а что если нужного контрола в стандартных библиотеках нет? Если хочется нарисовать на форме что-то необычное? В самом деле, это же графическое приложение :). Конечно же в Mac OS X сделать это возможно, причем, с помощью самого Cocoa. Для отрисовки графики в Mac OS X используется векторный двежок Quarz. Для того, чтобы отрендерить собственную 2D-сцену, нам потребуется создать свой класс-вид, наследник NSView. Нам нужно будет переопределить метод drawRect в этом классе. Для того, чтобы отрендерить собственную 2D-сцену нам потребуется создать свой класс-вид XCode создаст для нас два файла – MyView.h и MyView.m с шаблоном интерфейса и реализации нашего класса соответственно. Дропаем MyView.h из списка файлов проекта на главное окно Interface Builder. Теперь выбираем из палитры контролов Library CustomView, перетаскиваем его на нашу форму и в окошке инспектора задаем для этого контрола MyView в качестве базового класса. Устанавливаем высоту вида равной ширине (это нам пригодится для профилактики искажений в данном конкретном примере). Теперь нужно позаботиться о внешнем виде нашего контрола. Нарисуем что-нибудь красивое, например, монаду Инь-Янь. Все линии (path) будем создавать с помощью кривых Безье. В этом нам поможет Cocoa-класс NSBezierPath. Реализация класса MyView
ЗаключениеТеперь ты знаешь, как создать GUI’шное Cocoa-приложение. Процесс разработки под iOS для всяческих iPhone’ов и iPad’ов не сильно отличается от создания оконных приложений для макоси, который описан здесь, поэтому дерзай. Удачи! |