2012-05-04 3 views
0

Я пишу приложение, которое копирует plist в docsdir, а затем считывает его в изменяемый массив. Однако приведенный ниже код возвращает число 0 для массива. Однако строка со словарным журналом возвращает правильные элементы. Я также проверил, что файл копируется в docsdir.arrayWithFile возвращает count 0

-(NSString *)docsDir { 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
} 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *listPath = [[self docsDir]stringByAppendingPathComponent:@"list.plist"]; 
    if (![[NSFileManager defaultManager]fileExistsAtPath:listPath]) { 
     [[NSFileManager defaultManager]copyItemAtPath:[[NSBundle mainBundle]pathForResource:@"list" ofType:@"plist"] toPath:listPath error:nil]; 
     NSLog(@"Chicken"); 
    } 

    NSLog(@"%@", [NSDictionary dictionaryWithContentsOfFile:listPath]); 
    _array = [NSArray arrayWithContentsOfFile:listPath]; 

    NSLog(@"Count: %i", [_array count]); 

} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

ответ

1

Обычно это происходит потому, что корневой элемент по умолчанию в 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"> 
<dict> 
    <key>foo</key> 
    <array> 
     <string>foo1</string> 
     <string>foo2</string> 
     <string>foo3</string> 
    </array> 
</dict> 
</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> 
    <string>foo1</string> 
    <string>foo2</string> 
    <string>foo3</string> 
</array> 
</plist> 

где Корневой элемент - это массив. Теперь вы можете редактировать как обычно.

0

Открыть файл plist с помощью Xcode.

Просто найдите «ключ» в верхнем левом углу и Type plist.

Sample Plist file

Убедитесь, что Type является массивом.

0

Я думаю, что ваш plist - это словарь, содержащий массив.
Попробуйте

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:listPath] 
NSArray *array = [dict objectForKey:@"key"]; 
0

Plists обычно сэкономили словари:

Вот пример:

<dict> 
    <key>tiltingAnim</key> 
    <dict> 
     <key>filenamePrefix</key> 
     <string>radar_</string> 
     <key>delay</key> 
     <real>0.25</real> 
     <key>animationFrames</key> 
     <string>1,2,3,4,5,5,4,3,2,1,2,3,4,5</string> 
    </dict> 
    <key>takingAHitAnim</key> 
    <dict> 
     <key>filenamePrefix</key> 
     <string>radar_</string> 
     <key>delay</key> 
     <real>0.1</real> 
     <key>animationFrames</key> 
     <string>5,5,7,8,8</string> 
    </dict> 
    <key>blowingUpAnim</key> 
    <dict> 
     <key>filenamePrefix</key> 
     <string>radar_</string> 
     <key>delay</key> 
    <real>0.2</real> 
    <key>animationFrames</key> 
    <string>5,6,7,8,9,10,11,12,13,14,15,16,17</string> 
    </dict> 
    <key>transmittingAnim</key> 
    <dict> 
     <key>filenamePrefix</key> 
     <string>radar_</string> 
     <key>delay</key> 
     <real>0.3</real> 
     <key>animationFrames</key> 
     <string>5,6,5,6,5,6,5</string> 
    </dict> 
</dict>  

Теперь есть 2 решения вашего вопроса.

  1. Либо получить содержимое в словарь, а затем вывести массив для определенного ключа.
  2. Откройте plist текстовым редактором и измените корень ключа, а затем измените корень на. Если ваш plist статичен и в ресурсах пакета, вы можете это сделать, но если это plist, сгенерированный вашим кодом, тогда я бы не рекомендовал этого.
Смежные вопросы