Текст книги "Программирование на Objective-C 2.0"
Автор книги: Стивен Кочан
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 26 (всего у книги 32 страниц)
Внесите изменения в программу 19.2, чтобы вывести содержимое одного из списков свойств XML (файлы .plist), сохраненного в папке /Library/Preferences.
Напишите программу чтения архивированной адресной книги (AddressBook) и выполните поиск записи в соответствии с именем, указанным в командной строке, например $ lookup gregory
Часть III. Cocoa и SDK iPhone Глава 20. Введение в Cocoa
На протяжении этой книги мы разрабатывали программы, которые имеют до-вольно простой пользовательский интерфейс. Для вывода сообщений на кон-соль мы использовали процедуру @@ NSLog. Это действительно полезная про-цедура, но ее возможности ограничены. Другие программы, которые мы используем на своих Маках, имеют намного более удобный интерфейс. Репу-тация компьютеров Macintosh во многом основывается на дружественных пользовательских окнах и простоте использования. В своих приложениях мы можем использовать XCode вместе с приложением Interface Builder. Это сочета-ние образует мощную среду для разработки программ со средствами редакти-рования и отладки и удобным доступом к online-документации и позволяет легко разрабатывать сложные графические пользовательские интерфейсы (GUI).
Фреймворки для поддержки приложений, обеспечивающие удобный пользо-вательский интерфейс, называются Cocoa. Это два фреймворка: Foundation framework, с которым вы уже знакомы, и фреймворк Application Kit (или AppKit). Второй фреймворк содержит классы, связанные с окнами, кнопками, списками и т.д. 20.1. Уровни фреймворков
Чтобы показать уровни, которые отделяют приложение от оборудования, час-то используют схемы. Одна из таких схем показана на рис. 20.1.
Ядро системы обеспечивает низкоуровневую связь с оборудованием в форме драйверов устройств. Оно управляет ресурсами системы, такими как программы-планировщики, управление памятью и электропитанием и выполнение базовых операций ввода-вывода.
Сервисы ядра (Core Services) обеспечивают поддержку на нижнем уровне (уровне ядра), в отличие от находящихся выше уровней. Здесь обеспечивается поддержка коллекций, сетевого обмена, управления файлами, папок, управле-ния памятью, отладки, потоков, времени и электропитания.
Уровень Сервисов приложений (Application Services) включает поддержку печати и воспроизведения графики, включая Quartz, OpenGL и Quicktime. Пользователь
Рис. 20.1. Иерархия уровней для приложения
Непосредственно под приложением находится уровень Cocoa. Как говорилось выше, Cocoa содержитфреймворки Foundation и AppKit. Foundation содержит классы для работы с коллекциями, строками, для управления памятью, файловой системой, архивацией и т.д. AppKit содержит классы для управления представлениями (view), окнами, документами, а также для обширного пользовательского интерфейса, который гак хорошо известен пользователям Mac OS X.
Из этого описания возникает ощущение дублирования функций некоторых уровней. Например, коллекции существуют на уровнях Cocoa и сервисов ядра. Однако первый уровень основывается на поддержке со стороны второго уровня. Кроме того, в некоторых случаях определенный уровень можно пропускать. Например, некоторые классы Foundation для работы с файловой системой целиком основываются на функциях уровня сервисов ядра в обход уровня сервисов приложений. Во многих случаях фреймворк Foundation определяет объектно-ориентированное отображение структур данных, определенных на уровне сервисов ядра (написанных преимущественно на процедурном языке С). 20.2. Cocoa Touch
Телефон iPhone содержит компьютер, который работает под управлением уп-рощенной версии Mac OS X. Некоторые возможности оборудования iPhone, например, акселерометр, уникальны для этого телефона и отсутствуют на дру-гих компьютерах под управлением Mac OS X, таких как МасВоок или iMac.
Примечание. На самом деле ноутбуки Мак содержат акселерометр для выпол-нения парковки жесткого диска в случае падения компьютера, но вы не имеете непосредственного доступа к этому акселерометру.
В отличие от фреймворков Cocoa, используемых при разработке приложе-ний для настольных компьютеров и ноутбуков с Mac OS X, фреймворки Cocoa Touch используются для приложений, которые будут работать на iPhone и iTouch.
Cocoa и Cocoa Touch содержат один общий фреймворк – Foundation. Одна-ко в Cocoa Touch вместо фреймворка AppKit используется фреймворк UI Kit, поддерживающий много таких же типов объектов (окна, представления, кнопки, текстовые поля и т.д.). Кроме того, Cocoa Touch содержит классы для работы с акселерометром, триангуляции местоположения с помощью GPS и сигналов WiFi, а также сенсорный интерфейс. Из нею исключены ненужные классы, например, поддержка клавиатуры.
На этом заканчивается краткий обзор Cocoa. В следующей главе описыва-ется, как писать приложение для iPhone с использованием имитатора, который является частью комплекта разработки профамм (SDK) iPhone.
Глава 21. Написание приложений iPhone
В этой главе мы будем разрабатывать два простых приложения iPhone. В пер-вом из них вы познакомитесь с понятиями делегат (delegate), outlet-переменные и действия (action) и с некоторыми концепциям и использования Interface Builder и создания соединений. Во втором приложении мы создадим калькуля-тор для дробей, объединив то, что вы узнали при разработке первого приложения, со всем материалом этой книги. 21.1. Комплект разработки программ (SDK) для iPhone
Чтобы писать приложения для iPhone, необходимо установить Xcode и комп-лект iPhone SDK. Этот SDK можно получить бесплатно с веб-сайта Apple. Для загрузки SDK нужно зарегистрироваться в качестве разработчика Apple (Apple Developer). Этот процесс тоже выполняется бесплатно. Чтобы получить соот-ветствующие ссылки, начните с адреса developer.apple.com и перейдите к нуж-ному пункту. Обязательно ознакомьтесь с этим сайтом. В приложении D содер-жится несколько прямых ссылок на определенные места этого сайта, которые могут заинтересовать вас.
Материал этой главы основывается на Xcode 3.1.1 и iPhone SDK для iPhone OS 2.1. Следующие версии этих продуктов совместимы с изложенным здесь материалом. 21.2. Ваше первое приложение iPhone
В этом приложении показано, как поместить черно-белое окно на экран iPhone, разрешить пользователю нажать на кнопку и вывести текст в ответ на нажатие этой кнопки.
Примечание. Второе приложение еще интересней! В нем используется опыт первого приложения для создания простого калькулятора, позволяющего вы-полнять операции с дробями. Мы можем использовать класс Fraction, с которым работали в предыдущих главах, а также модифицированный класс Calculator. На этот раз калькулятор сможет работать с дробями.
Приступим к первой программе. Мы опишем самые необходимые шаги, чтобы на их основе вы могли разрабатывать собственные программы Cocoa или iPhone.
На рис. 21.1 показано наше первое приложение для iPhone, которое будет выполняться па имитаторе iPhone (об этом чуть ниже).
Рис. 21.1. Первое приложение для iPhone
В этом приложении при нажатии кнопки «1» на дисплее будет появляться соответствующая цифра (см. рис. 21.2). Оно больше ничего не делает! Это про-стое приложение является основой дня второю приложения, которое представ-ляет калькулятор дш работы с дробями.
Мы создадим приложение с помощью Xcode и пользовательский интерфейс с помощью Interface Builder. Если вы работали с Xcode в предыдущих главах, то можете использовать его для ввода и тестирования своих программ. Как гово-рилось выше, Interface Builder позволяет разрабатывать пользовательский ин-терфейс, размещая элементы пользовательского интерфейса (U1) – таблицы, метки и кнопки – в окне, которое похоже на элемент iPhone. Работа с Interface Builder, как с любым серьезным средством разработки, требует определенного опыта.
Apple распространяет имитатор (simulator) iPhone в составе SDK iPhone. Этот имитатор повторяет многие элементы среды iPhone, включая домашнюю страницу, веб-браузер Safari, приложение Contacts (Контакты) и т.д. Этот имитатор намного упрощает отладку приложений; вам не нужно каждый раз загружать разрабатываемое приложение на реальное устройство iPhone и затем выполнять отладку на этом устройстве.
Рис. 21.2. Первое приложение iPhone
Чтобы запускать приложения на устройстве iPhone, вам нужно зарегистри-роваться как разработчику программ iPhone и заплатить компании Apple 99 долларов (по состоянию на момент написания этой книги). В ответ вы получите код активации, который позволит вам получить сертификат разработки для iPhone (iPhone Development Certificate), чтобы вы могли тестировать и устанавливать приложения на своем iPhone. К сожалению, вы не можете разрабатывать приложения даже для вашего собственного iPhone без прохождения этого процесса. Приложение, которое мы разрабатываем в этой главе, будет загружаться и тестироваться на имитаторе iPhone, а не на устройстве iPhone. Создание нового проекта приложения iPhone
Вернемся к разработке нашего первого приложения. После установки SDK iPhone запустите приложение Xcode. В меню File (Файл) выберите New Project (Новый проект). Под iPhone OS (если этого пункта нет в левой панели, значит, вы не установили SDK iPhone) щелкните на Application (Приложение). Появится окно, показанное на рис. 21.3.
Здесь мы видим шаблоны, которые можно использовать как отправную точку для различных типов приложений, в соответствии с таблицей 21.1.
Рис. 21.3. Запуск нового проекта для iPhone
Табл. 21.1. Шаблоны приложений iPhone Tип приложения Описание Navigation-Based Для приложения, в котором используется контроллер навигации. Contacts – это пример приложения данного типа. OpenGL ES Для графических приложений OpenGL, например, игр. Tab Bar Для приложений, в которых используется полоса вкладок. Примером может служить приложение iPod. Utility Для приложения, где используется представление flipside (обратная сторона). Примером может служить приложение Stock Quote. View-Based Для приложения, в котором используется одно представление (view). Вы переходите к этому представлению и затем выводите его в окне. Window-Based Для приложения, которое запускается из главного окна iPhone. Его можно использовать как отправную точку для любого приложения
Вернувшись к окну New Project, выберите в верхней правой панели Window– Based Application и затем щелкните на кнопке Choose (Выбрать). При последующем запросе ввода имени проекта (в поле Save As —Сохранить как) введите текст iPhone_l и щелкните на кнопке Save (Сохранить). Это имя станет именем вашего приложения по умолчанию. Как вы уже знаете из предыдущих проектов, созданных с помощью Xcode, будет создан новый проект, содержащий шаблоны для необходимых файлов (рис. 21.4).
Рис. 21.4. Создание нового проекта iPhone
В зависимости от ваших настроек и предыдущего использования Xcode ваше окно может несколько отличаться от показанного на рисунке. Вы можете продолжить работу с текущего вида или постараться изменить его так, чтобы он походил на этот рисунок.
В верхнем левом углу окна Xcode мы видим раскрывающийся список, помеченный текущим выбором для SDK и активной конфигурации (Configuration). Поскольку мы не разрабатываем приложение для непосредственного выполнения на iPhone, нужно настроить SDK для работы с имитатором iPhone (Simulator) и для конфигурации задать вариант Debug (Отладка). Если этот рас-крывающийся список не помечен как Simulator | Debug, выберите соответствующие опции, как показано на рис. 21.5.
Рис. 21.5. Проект iPhoneJ с заданными опциями секций SDK и Configuration Ввод кода
Теперь мы можем внести изменения в некоторые файлы проекта. Обратите внимание, что для вас созданы классы «jWtfnpoeK/naAppDelegate.h и илщл/гаек/иаАрр Delegate.m (в данном примере имяпроекта – это iPhonc_l). Вся работа но управлению кнопками и метками в типе приложения Window– based, которое мы создаем, делегируется классу, который называется ш1я«росл:/лаАррDelegate (в данном случае – iPhone_ 1 AppDelegate). В этом классе мы определим методы, чтобы реагировать на действия, возникающие в окне iPhone, такие как нажатие кнопки или перемещение ползунка. Как вы увидите, конкретная связь между этими управляющими элементами и соответствую-щими методами задается в приложении Interface Builder.
Этот класс будет также содержать переменные конфшурации, значения которых соответствуют некоторому управляющему элементу в окне iPhone, например, имя на метке или текст, отображаемый в поле изменяемого текста. Эти переменные называют outlet-переменными, и, аналогично процедурам действий, мы связываем в Interface Builder переменные экземпляра с конкретным управляющим элементом окна iPhone.
Для нашего первого приложения нужен метод, реагирующий на действие, которое состоит из нажатия кнопки с меткой I. Нам нужна также outlet-пере-менная, содержащая (среди прочей информации) текст, который должен отображаться на метке, создаваемой вверху окна iPhone.
Внесем изменения в файл iPhone_1AppDelegate.h, чтобы добавить переменную типа UlLabel с именем display и объявить метод для действия с именем clickl:, чтобы реагировать на нажатие кнопки. Наш файл секции interface показан в программе 21.1. (Здесь нет строк комментария, которые автоматически вставляются в начале файла.)
Программа 21.1. iPhoneJAppDelegate.h #import
Отметим, что приложения iPhone импортируют header-файл . Этот файл импортирует, в свою очередь, другие header-файлы UIKit, что аналогично импорту в файле Foundation.h других нужных header-файлов, например, NSString.h и NSObject.h. Чтобы посмотреть содержимое этого файла, нужно пройти достаточно длинный путь. На момент написания этой книги он содержался в папке /Devetoper/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulatог2.1.sdk/System/Library/Franriewor ks/UIKit.framework/Headers/.
Теперь класс iPhoneJAppDelegate содержит две переменные экземпляра. Первая – это объект UlWindow с именем window. Эта переменная экземпляра создается автоматически, когда мы создаем проект, и является ссылкой на главное окно iPhone. Мы добавили еще одну переменную экземпляра с именем display, которая принадлежит классу UlLabel. Это outlet-псрсмснная, которая будет связана с меткой. Когда мы задаем текстовое поле для этой переменной, происходит изменение текста для метки в окне. Другие методы, определенные для класса UlLabel, позволяют задавать и считывать такие атрибуты метки, как цвет, число строк и размер шрифта.
Для создания интерфейсов вам потребуются и другие классы, но мы не будем описывать их здесь. Имена некоторых классов объясняют их назначение: UlTextField (Текстовое поле), UIFont (Шрифт), UlView (Представление), UITableView(Табличное представление), UllmageView (Представление изображения), Ullmage (Изображение) и UIButton (Кнопка).
Обе переменные – window и display – являются outlet-переменными. В объявлениях свойств для этих переменных используется идентификатор IBOutlet. IBOutlet определяется как nothing (ничто) в header-файле UINibDeclarations.h для UIKit. (То есть он фактически не заменяется ничем в исходном файле при обработке препроцессором.) Однако он необходим, поскольку Interface Builder ищет IBOutlet, когда читает header-файл, чтобы определить, какие переменные можно использовать как outlet-переменные.
В этом interface-файле отметим объявление метода с именем clickl: ему передается один аргумент с именем sender. При вызове метода clickl: в этом аргументе ему будет передаваться информация, связанная сданным событием. Например, если у нас имеется action-процедура для обработки нажатий различных кнопок, то этот аргумент можно запрашивать для определения нажатой кнопки.
Метод clickl: определен для возврата значения типа IBAction. (Оно определяется как void в файле UINibDectarations.h.) Аналогично IBOutlet, этот идентификатор используется приложением Interface Builder, когда оно просматривает header-файл, чтобы определить, какие методы можно рассматривать как действия (action).
Теперь можно внести изменения в implemcntation-файл iPhoneJAppDelegate.m для нашего класса. Здесь мы синтезируем методы досгупа (accessor method) для переменной display (методы доступа для window уже сип тезированы для вас) и добавляем определение для метода clickl
Внесите изменения в implementation-файл, чтобы он был похож на файл, показанный в программе 21.1.
Программа 21.1. iPhoneJAppDelegate.m #import ""iPhoneJAppDelegate.h"" @implementation iPhoneJAppDelegate @synthesize window, display; -(void) applicationDidFinishlaunching:(U!Application *(application { // Место переопределения для настройки после запуска приложения [window makeKeyAndVisi ble]; } -(IBAction) clickl: (id) sender { (display setText: @T]; } -(void) dealloc { [window release]; [super dealloc]; @end
Метод applicationDidFinishLaunching: автоматически вызывается системой runtime iPhone один раз; как следует из его имени, оно означает, что запуск приложения завершен. Здесь можно инициализировать переменные экземпляра, нарисовать что-то на экране и сделать окно видимым для отображения его содержимого. Последнее действие осуществляется при передаче сообщения makeKeyAndVisible окну (window) в конце этого метода.
Метод clickl: задает отображение этой outlet-переменной в строке 1 с помощью метода UlLabel setText:. Когда мы свяжем нажатие кнопки с вызовом данного метода, он сможет выполнить нужное действие: поместить 1 на дисплей в окне iPhone. Чтобы задать эту связь, вы должны узнать, как используется Interface Builder. Прежде чем сделать это, нужно собрать программу, чтобы удалить предупреждения компилятора или сообшения об ошибках. Проектирование интерфейса
На рис. 21.4 и в вашем главном окне Xcode обратите внимание на файл MainWindow.xib. Файл с расширением »Ь содержит всю информацию о пользовательском интерфейсе для программы, включая информацию о его окнах, кнопках метках, полосах вкладок (tab bar), текстовых полях и т.д. Конечно, у нас еше нет пользовательского интерфейса! Это следующий шаг.
Дважды щелкните на файле MainWindow.xib. Будет запушено еше одно приложение, Interface Builder. Доступ к этому XIВ-файлу можно также выполнить из папки Resources вашего проекта.
При запуске Interface Builder на экране появится последовательность окон (рис. 2I.6, 21.7, 21.8). Окна, которые открываются у вас, могут отличаться от изображенных на рисунках.
Рис. 21.6. Окно Library приложения Interface Builder
Окно Library (Библиотека) содержит набор управляющих элементов интерфейса. Это окно представлено на рис. 21.6я.
Окно MainWindow.xib (рис. 21.7) является управляющим окном для задания связей между кодом приложения и интерфейсом.
Рис. 21.7. Окно Interlace Builder MainWindow.xib
В окне под заголовком Window показан макет главного окна iPhone. Поскольку мы еше ничего не создали для окна iPhone, оно является пустым (рис. 21.8).
Сначала зададим черный цвет для окна iPhone. Для этого щелкните внутри окна под заголовком Window и выберите пункт Inspector в меню Tools (Сервис). Появится окно Inspector (рис. 21.9).
Убедитесь, что окно Inspector называется Window Attributes (Атрибуты окна), как на рисунке 21.9. Если это не так, щелкните на левой вкладке в полосе вкладок, чтобы отобразить нужное окно.
В секции View (Вид) этот окна имеется атрибуте именем Background (Фон). Дважды щелкните внутри белого прямоугольника рядом с меткой Background. Появится указатель цветов. Выберите черный цвет из этого указателя. Цвет прямоугольника рядом с атрибутом Background изменится на черный (рис. 21.10).
Окно Window, представляющее окно отображения iPhone, тоже будет иметь черный цвет (рис. 21.11).
Теперь можно закрыть окно цветов Colors.
Для создания нового объекта в окне интерфейса iPhone нужно щелкнуть на объекте в окне Library и перетянуть его в ваше окно iPhone. Щелкните и перетяните элемент Label (Метка). Отпустите кнопку мыши, когда метка окажется наверху примерно посередине окна (рис. 21.12).
Во время перемещения метки в окне будут показаны синие направляющие линии. Иногда они нужны для выравнивания объектов относительно других объектов, размещенных ранее в этом окне. Иногда они требуются, чтобы объекты находились на достаточном расстоянии друг от друга и от краев окна в соответствии с рекомендациями Apple.
Рис. 21.8. Окно iPhone в Interface Builder
Рис. 21.9. Окно Inspector в Interface Builder
Рис. 21.10. Изменение цвета фона окна
Рис. 21.11. Изменение цвета окна интерфейса на черный цвет
Рис. 21.12. Добавление метки
Вы можете в любой момент перетянуть метку в другое место внутри окна.
Теперь зададим некоторые атрибуты для этой метки. Щелкните на метке, которую вы только что создали, чтобы выделить ее (если она еще не выделена). Отметим, что окно Inspector автоматически изменяется, чтобы вы получали информацию о текущем выбранном объекте в вашем окне. Нам не нужно, чтобы текст по умолчанию появился в этой метке, поэтому измените значение Text на пустую строку, то есть удалите текст Label из текстового поля, показанного в окне Inspector.
Для атрибута Layout (Компоновка) выберите Right-justified (Выравнивание справа) среди вариантов выравнивания (Alignment). И, наконец, измените цвет фона (background) для метки на синий так же, как изменили цвет фона окна на черный. Ваше окно Inspector должно быть похоже на рис. 2I.I3.
Теперь изменим размер метки. Вернемся к окну Window и изменим размер метки, растянув ее углы и стороны. Измените размер и местоположение метки, чтобы она выглядела, как на рисунке 21.14.
Теперь добавим в этот интерфейс кнопку. Из окна Library перетяните объект Round Rect Button в ваше окно интерфейса, поместив его в нижний левый угол окна (рис. 21.15). Метку на этой кнопке можно изменить одним из двух способов: дважды щелкнуть на кнопке и затем ввести нужный текст или ввести текст в поле Title (Заголовок) в окне Inspector. При любом способе сделайте так, чтобы ваше окно было похоже на показанное на рисунке 21.15.
Рис. 21.13. Изменение атрибутов метки
Теперь у нас есть метка, которую нужно связать с переменной экземпляра display, чтобы при задании этой переменной в программе текст метки был изменен.
У нас также есть кнопка с меткой 1, для которой нужно задать вызов метода clickl: при каждом нажатии этой кнопки. Этот метод задаст значение 1 для текстового поля на дисплее. А поскольку эта переменная будет связана с данной меткой, метка будет изменяться. Приведем ниже последовательность, которую нужно задать.
Пользователь нажимает кнопку с меткой 1.
По этому событию вызывается метод dickl:.
Метод clickl: изменяет текст переменной экземпляра display на строку 1.
Поскольку объект DILabel display связан с меткой в окне iPhone, текст этой метки изменяется на соответствующее текстовое значение, равное 1.
Рис. 21.14. Изменение размера и местоположения метки
Рис. 21.15. Добавление кнопки в интерфейс
Для выполнения этой последовательности нам требуются только две привязки.
Сначала свяжем кнопку с методом IBAction clickl:. Для этого удерживайте нажатой клавишу Control во время щелчка на этой кнопке и затем протяните синюю линию, которая появится на экране, к кубику делегата приложения (AppDelegate) в окне MainWindow.xib, как показано рис. 21.16.
Когда вы отпустите кнопку мыши над кубиком делегата приложения, появится раскрывающееся меню, где можно выбрать метод IBAction для привязки к кнопке. В данном случае имеется только один такой метод (с именем clickl:), и он появится в этом раскрывающемся меню. Выберите этот метод, чтобы создать привязку (рис. 21.17).
Теперь выполним привязку переменной display к метке. Нажатие кнопки вызывает выполнение метода в приложении (то есть управление передается от интерфейса к делегата приложения), задание значения переменной экземпляра в приложении вызывает изменение текста метки в окне iPhone. (Управление передается от делегата приложения к интерфейсу.) Поэтому, удерживая нажатой клавишу Control, щелкните на значке делегата приложения и протяните к метке синюю линию, которая появится в окне Window (рис. 21.18).
Рис. 21.16. Добавление действия для кнопки
Рис. 21.17. Привязка события к методу
Рис. 21.18. Привязка outlet-переменной
Отпустив кнопку мыши, мы получим список outlet-переменных соответствующего класса как элемент управления (UlLabel), среди которых можно сделать выбор. В нашей программе такая переменная одна – с именем display. Выберите ее и выполните привязку (рис. 21.19).
Выберите File->Save в линейке меню Interface Builder и затем Build and Go в Xcode. (Это можно также инициировать из Interface Builder.)
Если все проходит нормально, программа будет успешно собрана и начнет выполняться. При этом она будет сначала загружена в имитатор iPhone, который появится на экране вашего компьютера (см. рис. 21.1). Чтобы имитировать нажатие кнопки в имитаторе, нужно просто щелкнуть на ней. Последовательность шагов и привязок, которая описана выше, будет реализована в виде отображения текстовой строки 1 в метке вверху дисплея, как показано на рис. 21.2.
Рис. 21.19. Завершение привязки 21.3. Калькулятор дробей для iPhone
Следующий пример несколько сложнее, но к нему применяются все концеп-ции предыдущего примера. Мы не будем описывать шаги по созданию этого примера полностью, а только приведем сводку этих шагов и дадим обзор методологии разработки. И, конечно, покажем весь код.
Сначала рассмотрим, как работает приложение. Приложение на имитаторе непосредственно после запуска показано на рис. 21,20.
Этот калькулятор позволяет вводить дроби. Сначала вводится числитель (numerator), затем нужно нажать клавишу с меткой Over и ввести знаменатель (denominator). Таким образом, чтобы ввести дробь 2/5, нужно нажать 2, затем Over и 5. В отличие от других калькуляторов, это приложение показывает простую дробь на дисплее, то есть 2/5 отображается как 2/5.
После ввода дроби нужно выбрать операцию: сложение, вычитание, умножение или деление – и нажать клавишу +, -, х или ?.
После ввода второй дроби нужно завершить операцию, нажав клавишу =, как в стандартном калькуляторе.
Примечание. Этот калькулятор может выполнять только одну операцию над дробями. В упражнении в конце главы от вас потребуется снять это ограниче-ние.
Рис. 21.20. Калькулятор дробей после запуска
По мере нажатия клавиш дисплей непрерывно обновляется. На рис. 21.21 показан дисплей после ввода дроби 4/6 и нажатия клавиши умножения.
На рис. 21.22 показан результат умножения дробей 4/6 и 2/8. Результат 1/6 показывает, что выполняется сокращение результирующей дроби. Запуск нового проекта Fraction_Calculator
Первая программа iPhone в этой главе начиналась с шаблона проекта типа Window-Based. Наша небольшая работа, связанная с пользовательским интерфейсом (Ш), была выполнена непосредственно в контроллере приложения (с помошью класса AppDelegate). Такой подход не рекомендуется для разработки приложений с насыщенным пользовательским интерфейсом. Класс AppDelegate обычно используется только для обработки изменений, относящихся к состоянию самого приложения, например, к окончанию запуска приложения или к его завершению.
Рис. 21.21 Ввод операции
Контроллер представлений (view controller), реализованный с помощью класса UlViewController, подходит именно для действий, относящихся к Ш, таких как отображение текста, реагирование на нажатие кнопки или вывод другого представления на экране iPhone.
Разработку второго примера программы мы начнем с создания нового проекта. На этот раз в окне New Project мы выберем тип View-Based Application и назовем новый проект Fraction_Calculator.
Рис. 21.22. Результат умножения двух дробей
При создании проекта вы увидите, что на этот раз используются два шаблона классов. FractionCalculatorAppDelegate.il и Fraction_CalсuIatorАрpDelegate.m определяют для нашего проекта класс контроллера приложения, a Fraction CalculatorViewController.h и Fraction CalculatorViewController.m определяют класс контроллера представлений. Как говорилось выше, вся наша работа будет выполнена именно во втором классе.
Начнем с класса контроллера приложения. Он содержит две переменные экземпляра: одну для ссылки на окно iPhone и вторую – для контроллера представлений. Обе переменные заданы вХсобе. Вам не потребуется вносить никакие изменения в .h-файл и .m-файл контроллера приложения.
Файл секции interface Fraction_CalculatorApp Delegate показан в программе 21.2.
Программа 21.2. Interface-файл Fraction_CalculatorAppDelegate.h #import
Переменная экземпляра UlWindow window предназначена для той же цели, что и в первой программе: она представляет окно iPhone. Переменная экземпляра Fraction_CalculatorViewController используется для контроллера представлений, который будет управлять всем взаимодействием с пользователем и выводом на дисплей. В файле секции implementation для этого класса мы реализуем всю работу, связанную с этими задачами.
В программе 21.2 показан implementation-файл для класса контроллера приложения. Как говорилось выше, мы не будем делать никакой работы в этом файле (в отличие от программы 21.1); вся работа передается контроллеру представлений. Таким образом, этот файл показан так, как он генерируется Xcode при создании нового проекта.
Программа 21.2. Implementation-файл Fraction_CalculatorAppDelegate.m #import "FractionCalculatorAppDelegate.h" #import "Fraction CalculatorViewController.h" @implementation Fraction_CalculatorAppDelegate @synthesize window; @synthesize viewController; -(void)applicationDidFinishLaunching:(UIApplication *(application ( // Место переопределения для настройки после запуска приложения [window addSubview:viewController.view]; [window makeKeyAndVisible]; -(void)dealloc { [viewController release]; [super deallocj; @end Определение контроллера представлений
Теперь мы напишем код для класса контроллера представлений Fraction CalculatorViewController. Начнем с файла секции interface. Он показан в про грамме 21.2.