Быстрый запуск для списков свойств
Это миниучебное руководство дает Вам быстрое, практическое введение в списки свойств. Вы запускаете путем указания короткого списка свойств в XML. Тогда Вы разрабатываете приложение, когда оно запускается, читающее и преобразовывающее элементы списка свойств XML в их объектные эквиваленты и хранящее эти объекты в переменных экземпляра. Отображения приложения эти объект оценивает в пользовательском интерфейсе и позволяет Вам изменять их. При выходе из приложения оно выписывает измененный список свойств как XML. Когда Вы повторно запускаете приложение, новые значения выведены на экран.
Создайте список свойств XML
В XCode создайте простой проект приложения Какао — вызывают его PropertyListExample. Тогда выберите папку Resources проекта и выберите New File из меню File. В категории шаблона «Other» выберите шаблон Property List и нажмите Далее. Назовите файл «Data.plist».
Дважды щелкните Data.plist
файл в XCode (Вы найдете его в папке Resources). XCode выводит на экран пустой список свойств в специальном редакторе. Отредактируйте список свойств так, чтобы он был похож на следующий пример:
Можно также отредактировать список свойств в текстовом редакторе, таком как TextEdit или BBEdit. Когда Вы закончены, это должно быть похожим на следующий код XML.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Name</key> <string>John Doe</string> <key>Phones</key> <array> <string>408-974-0000</string> <string>503-333-5555</string> </array> </dict> </plist> |
Поскольку файл списка свойств находится в папке Resources, он будет записан в основной пакет приложения, когда Вы разработаете проект.
Определите хранение для объектов списка свойств
На этом шаге Вы добавите класс контроллера координирования к проекту и объявите, что свойства содержат объекты списка свойств, определенные в Data.plist
. (Отметьте различие здесь между заявленным свойством и объектом списка свойств.)
В XCode выберите папку Classes и выберите New File из меню File. Выберите Objective-C Class template и назовите файлы «Controller.h» и «Controller.m». Сделайте следующие заявления в Controller.h
.
#import <Cocoa/Cocoa.h> |
@interface Controller : NSObject { |
NSString *personName; |
NSMutableArray *phoneNumbers; |
} |
@property (copy, nonatomic) NSString *personName; |
@property (retain, nonatomic) NSMutableArray *phoneNumbers; |
@end |
В Controller.m
, имейте компилятор, синтезируют методы доступа для этих свойств:
@implementation Controller |
@synthesize personName; |
@synthesize phoneNumbers; |
@end |
Создайте пользовательский интерфейс
Дважды щелкните по файлу пера проекта для открытия его в Интерфейсном Разработчике. Создайте простой пользовательский интерфейс, подобный следующему:
Табличное представление должно иметь отдельный столбец, который доступен для редактирования.
По причинам простоты и эффективности, Вы затем свяжете текстовое поле с personName
свойство. Но Ваш объект Контроллера будет действовать как источник данных для таблицы. Давайте запустимся с текстового поля.
Перетащите прокси родового объекта из Библиотеки в окно документа пера. Выберите его и, в области Identify инспектора, введите или выберите «Controller» для его идентификационных данных класса.
Перетащите Объектный объект Контроллера из Библиотеки в окно документа пера. Перетащите управление (или перетащите щелчок правой кнопкой), строка с Объектного Контроллера на Контроллер и, в окне соединения, раскрывающемся, выбирает «содержание».
Выберите доступное для редактирования текстовое поле и, в области Bindings инспектора, свяжите атрибут значения текстового поля согласно следующему:
Свяжите с: объектный контроллер
Ключ контроллера: выбор
Ключевой Путь модели: personName
Затем, Перетащите управление строку от Владельца Файла в окне документа пера (Владелец файла в этом случае представляет глобальную переменную NSApplication
объект) к объекту Контроллера и затем выбирают delegate
в окне соединения. Как Вы будете видеть, делегат приложения (Контроллер) играет роль в сохранении списка свойств к его представлению XML.
Для табличного представления Перетащите управление строку от табличного представления до объекта Контроллера в окне документа пера. Выберите dataSource
выход в окне соединения. Сохраните файл пера. Скопируйте код в Перечислении 1-1 к Controller.m
.
Реализация перечисления 1-1 кодирует для источника данных табличного представления
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { |
return self.phoneNumbers.count; |
} |
- (id)tableView:(NSTableView *)tableView |
objectValueForTableColumn:(NSTableColumn *)tableColumn |
row:(NSInteger)row { |
return [phoneNumbers objectAtIndex:row]; |
} |
- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object |
forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { |
[phoneNumbers replaceObjectsAtIndexes:[NSIndexSet indexSetWithIndex:row] |
withObjects:[NSArray arrayWithObject:object]]; |
} |
Обратите внимание на то, что последний метод синхронизирует изменения в элементах в табличном представлении с phoneNumbers
непостоянный массив, поддерживающий его.
Читайте в списке свойств
Теперь, когда необходимые задачи пользовательского интерфейса выполнены, мы можем фокусироваться на коде, который является определенным для списков свойств. В init
когда приложение сначала запускается, метод, Контроллер возражает чтениям в начальном списке свойств XML от основного пакета; после того это получает список свойств от пользователя Documents
каталог. Как только это имеет список свойств, это преобразовывает свои элементы в соответствующие объекты списка свойств. Перечисление 1-2 показывает, как оно делает это.
Перечисление 1-2 , Читающее в и преобразовывающее список свойств XML
- (id) init { |
self = [super init]; |
if (self) { |
NSString *errorDesc = nil; |
NSPropertyListFormat format; |
NSString *plistPath; |
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, |
NSUserDomainMask, YES) objectAtIndex:0]; |
plistPath = [rootPath stringByAppendingPathComponent:@"Data.plist"]; |
if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) { |
plistPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; |
} |
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; |
NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization |
propertyListFromData:plistXML |
mutabilityOption:NSPropertyListMutableContainersAndLeaves |
format:&format |
errorDescription:&errorDesc]; |
if (!temp) { |
NSLog(@"Error reading plist: %@, format: %d", errorDesc, format); |
} |
self.personName = [temp objectForKey:@"Name"]; |
self.phoneNumbers = [NSMutableArray arrayWithArray:[temp objectForKey:@"Phones"]]; |
} |
return self; |
} |
Этот код сначала получает путь файловой системы к файлу, содержащему список свойств XML (Data.plist
) в ~/Documents
каталог. Если нет никакого файла тем именем в том расположении, оно получает файл списка свойств из основного пакета приложения. Тогда это использует NSFileManager
метод contentsAtPath:
считать список свойств в память как NSData
объект. После этого это вызывает NSPropertyListSerialization
метод класса propertyListFromData:mutabilityOption:format:errorDescription:
преобразовать статический список свойств в соответствующие объекты списка свойств — в частности, словарь, содержащий строку и массив строк. Это присваивает строку и массив строк к надлежащим свойствам объекта Контроллера.
Выпишите список свойств
Когда пользователь выходит из приложения, Вы хотите сохранить текущую стоимость personName
и phoneNumbers
свойства в объекте словаря, преобразуйте те, список свойств возражает против статического представления XML, и затем запишите что данные XML в файл в ~/Documents
. applicationShouldTerminate:
делегат метод NSApplication
надлежащее место для записи кода, показанного в Перечислении 1-3.
Преобразование перечисления 1-3 и запись списка свойств к комплекту приложений
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { |
NSString *error; |
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; |
NSString *plistPath = [rootPath stringByAppendingPathComponent:@"Data.plist"]; |
NSDictionary *plistDict = [NSDictionary dictionaryWithObjects: |
[NSArray arrayWithObjects: personName, phoneNumbers, nil] |
forKeys:[NSArray arrayWithObjects: @"Name", @"Phones", nil]]; |
NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict |
format:NSPropertyListXMLFormat_v1_0 |
errorDescription:&error]; |
if(plistData) { |
[plistData writeToFile:plistPath atomically:YES]; |
} |
else { |
NSLog(error); |
[error release]; |
} |
return NSTerminateNow; |
} |
Этот код создает NSDictionary
объект, содержащий значения personName
и phoneNumbers
свойства и партнеры они с ключами «Name» и «Phones». Затем использование dataFromPropertyList:format:errorDescription:
метод класса из NSPropertyListSerialization
, это преобразовывает этот словарь верхнего уровня, и другой список свойств возражает, что это содержит в данные XML. Наконец, это пишет данные XML в Data.plist
в пользователе Documents
каталог.
Выполненный и тест приложение
Сборка и запущенный приложение. Окно появляется с числами имени и телефона, которые Вы указали в списке свойств XML. Измените имя и телефонный номер и выйдите из приложения. Найдите Data.plist
файл в ~/Documents
и откройте его в текстовом редакторе. Вы будете видеть, что изменения, которые Вы внесли в пользовательском интерфейсе, отражаются в списке свойств XML. При запуске приложения снова оно выводит на экран измененные значения.