Быстрый запуск для списков свойств

Это миниучебное руководство дает Вам быстрое, практическое введение в списки свойств. Вы запускаете путем указания короткого списка свойств в XML. Тогда Вы разрабатываете приложение, когда оно запускается, читающее и преобразовывающее элементы списка свойств XML в их объектные эквиваленты и хранящее эти объекты в переменных экземпляра. Отображения приложения эти объект оценивает в пользовательском интерфейсе и позволяет Вам изменять их. При выходе из приложения оно выписывает измененный список свойств как XML. Когда Вы повторно запускаете приложение, новые значения выведены на экран.

Создайте список свойств XML

В XCode создайте простой проект приложения Какао — вызывают его PropertyListExample. Тогда выберите папку Resources проекта и выберите New File из меню File. В категории шаблона «Other» выберите шаблон Property List и нажмите Далее. Назовите файл «Data.plist».

Дважды щелкните Data.plist файл в XCode (Вы найдете его в папке Resources). XCode выводит на экран пустой список свойств в специальном редакторе. Отредактируйте список свойств так, чтобы он был похож на следующий пример:

Xcode property list editor

Можно также отредактировать список свойств в текстовом редакторе, таком как 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

Создайте пользовательский интерфейс

Дважды щелкните по файлу пера проекта для открытия его в Интерфейсном Разработчике. Создайте простой пользовательский интерфейс, подобный следующему:

User interface for tutorial application

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

По причинам простоты и эффективности, Вы затем свяжете текстовое поле с personName свойство. Но Ваш объект Контроллера будет действовать как источник данных для таблицы. Давайте запустимся с текстового поля.

  1. Перетащите прокси родового объекта из Библиотеки в окно документа пера. Выберите его и, в области Identify инспектора, введите или выберите «Controller» для его идентификационных данных класса.

  2. Перетащите Объектный объект Контроллера из Библиотеки в окно документа пера. Перетащите управление (или перетащите щелчок правой кнопкой), строка с Объектного Контроллера на Контроллер и, в окне соединения, раскрывающемся, выбирает «содержание».

  3. Выберите доступное для редактирования текстовое поле и, в области 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. При запуске приложения снова оно выводит на экран измененные значения.