2013-02-25 2 views
0

Я новичок в iOS. Каждый ресурс, который я нахожу, содержит только ключевые пары строк в dicts внутри plists.Встроить Array в структуру Dict в plist

<key></key> 
<string></string> 

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

<array> 
    <dict> 
     <key>title</key> 
     <string>SomeTitle</string> 
      . 
      . 
      . 
     <key>filters</key> 
     <array>??? 

     </array>??? 
    </dict> 
</array> 
+0

Да, вы можете иметь массив в качестве значения в словаре. Для этого используйте редактор plist Xcode. Или, по крайней мере, использовать его, чтобы вы начали. Гораздо меньше ошибок, чем редактирование необработанного XML. – rmaddy

+0

Плиты будут размещены на сервере, написанном другими разработчиками без доступа к xcode или mac в целом. Поэтому я искал правильный способ кодирования XML и затем проанализировать его в коде. – Hub3rt

+0

Все в порядке. Создайте образец plist в Xcode и используйте это как основу для фактических файлов plist, которые вам нужно создать без Xcode. – rmaddy

ответ

0

Для вас, чтобы иметь возможность загружать файл Plist, используя метод initWithContentsOfFile:, он должен быть надлежащим PLIST файл.

<?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"> 
<array> 
    <dict> 
     <key>PageTitle</key> 
     <string>Title</string> 
     <key>Filters</key> 
     <array> 
      <dict> 
       <key>Filter</key> 
       <string>SomeFilter</string> 
       <key>Param</key> 
       <string>SomeParam</string> 
      </dict> 
     </array> 
    </dict> 
</array> 
</plist> 

Кроме того, эта линия:

NSMutableArray* filters = [[[NSMutableArray alloc] initWithArray:[dict objectForKey:@"Filters"]] retain]; 

должно быть просто:

NSMutableArray* filters = [dict[@"Filters"] mutableCopy]; 
+0

ОК плохо попробуйте, что вторая линия спасибо. Я должен был добавить заголовок plist, я просто совпадал с массивом, у него действительно есть правильный формат plist, это плохо. – Hub3rt

+0

это действительно отвечает на мой первоначальный вопрос о том, как получить массив в plist, поэтому я принимаю. В переменной dict все еще содержится ключ «PageTitle», нет «Фильтры», но это другой вопрос. – Hub3rt

0

использованием

<key>SomeKey</key> 
<array> 
</array> 

нас правильно после того, как все. Мой синтаксический код просто не узнал его.

Я использую код парсинга

NSMutableArray* propertyList = [[NSMutableArray alloc] initWithContentsOfFile:path]; 
NSMutableDictionary* dict = [propertyFile objectAtIndex:0]; 
NSMutableArray* filters = [[[NSMutableArray alloc] initWithArray:[dict objectForKey:@"Filters"]] retain]; 

с PLIST из

<array> 
    <dict> 
     <key>PageTitle</key> 
     <string>Title</string> 
     <key>Filters</key> 
     <array> 
      <dict> 
       <key>Filter</key> 
       <string>SomeFilter</string> 
       <key>Param</key> 
       <string>SomeParam</string> 
      </dict> 
     </array> 
    </dict> 
</array> 
+0

Что такое «разбор» кода? Почему вы просто не загружаете plist в массив, используя 'NSArray arrayWithContentsOfFile:'? – rmaddy

+0

Я, но это не узнает. – Hub3rt

+0

Я, но это не признает. см. править выше – Hub3rt

Смежные вопросы