Цель C: Запись в Plist - PullRequest
       15

Цель C: Запись в Plist

0 голосов
/ 17 марта 2012

Несмотря на то, что я знаю, что есть как минимум 2 или 3 темы с этим именем, я не нашел правильного ответа на свою проблему: я хочу отредактировать Plist (который был создан zwoptex (программой для работы с изображениями / анимациями)), чтобы разделить каждое число в нем на 2. Поэтому в моем списке есть некоторые ключи, такие как «spriteOffset» с {{182, 160}, {58,75}} или {192, 165} в качестве значения.Это NSStrings, и я просто хочу изменить числа, поэтому мне нужно проверить, есть ли "{" или пробел или что-то подобное, а затем привести число.Дело в том, что я действительно не знаю, как это сделать ..... Кроме того, мне кажется, что я что-то упустил из-за моего управления списком.Я поместил несколько NSLogs для отображения каждой из этих строк в моем списке, но .... ничего не отображается ... Вот мой код:

-(void)DivideValues
{
   for(NSString * plistName in plistSubpathsByName)
{
    NSMutableDictionary* infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"%@.plist",plistName]];

    for(NSDictionary * sprite in [infoDict objectForKey:@"frames"])
    {
        for(NSString * string in [infoDict objectForKey:@"spriteColorRect"])
        {
            NSLog(@"%@",string);
        }
        for(NSString * string in [infoDict objectForKey:@"spriteOffset"])
        {
            NSLog(@"%@",string);
        }
        for(NSString * string in [infoDict objectForKey:@"spriteSize"])
        {
            NSLog(@"%@",string);
        }
        for(NSString * string in [infoDict objectForKey:@"spriteSourceSize"])
        {
            NSLog(@"%@",string);
        }
        for(NSString * string in [infoDict objectForKey:@"textureRect"])
        {
            NSLog(@"%@",string);
        }
    }

    }
}

Спасибо за любой ответ, и я желаювсем удачи в карьере / увлечении

Ответы [ 3 ]

0 голосов
/ 18 марта 2012

Прежде всего, вы должны заменить [infoDict objectForKey:@"spriteColorRect"] на [sprite objectForKey:@"spriteColorRect"], так как спрайт, вероятно, является диктом, содержащим дополнительную информацию.
Вы не видите никаких журналов, потому что -objectForKey: возвращает nil для ключаэтого не существует.

Для изменения значений вы можете попытаться создать CGPoint или CGRect из строки, затем изменить его и, наконец, преобразовать обратно в строку.(CGPointFromNSString() and NSStringFromCGPoint)

Чтобы сохранить измененную версию вашего словаря, используйте NSDictionary's -writeToFile:atomically:.

0 голосов
/ 20 марта 2012

Хорошо, я преуспел, поэтому, если кому-то интересно, вот код:

-(void)DivideValues
{
for(NSString * xflName in [xflSubpathsByName objectEnumerator]){

    NSMutableDictionary* infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:[sourceFolder stringByAppendingPathComponent:xflName]];

    NSDictionary * dictionary = [infoDict objectForKey:@"frames"];
    NSMutableDictionary * mutabledictionary = [[dictionary mutableCopy] autorelease];

    for(NSString * pngFileName in dictionary) {

        NSDictionary * sprite = [dictionary objectForKey:pngFileName];

        NSLog(pngFileName);
        NSMutableDictionary * mutablesprite = [[sprite mutableCopy] autorelease];

        NSString * newstring = [self castSpriteRect:[sprite objectForKey:@"spriteColorRect"]];
        [mutablesprite setObject:newstring forKey:@"spriteColorRect"];

        newstring = [self castSprite:[sprite objectForKey:@"spriteOffset"]];
        [mutablesprite setObject:newstring forKey:@"spriteOffset"];

        newstring = [self castSprite:[sprite objectForKey:@"spriteSize"]];
        [mutablesprite setObject:newstring forKey:@"spriteSize"];

        newstring = [self castSprite:[sprite objectForKey:@"spriteSourceSize"]];
        [mutablesprite setObject:newstring forKey:@"spriteSourceSize"];

        newstring = [self castSpriteRect:[sprite objectForKey:@"textureRect"]];
        [mutablesprite setObject:newstring forKey:@"textureRect"];

        [mutabledictionary setObject:mutablesprite forKey:pngFileName];

    }

    [infoDict setObject:mutabledictionary forKey:@"frames"];
            [infoDict writeToFile:[sourceFolder stringByAppendingPathComponent:xflName] atomically:NO];
    }

if(!cancelling)
    ++digestStage;
else
    digestStage = End;
}

-(NSString *)castSprite:(id)obj{
CGPoint point = NSPointFromString((NSString *)obj);
int i = (int)point.x%2 == 0 ?(int)point.x/2:1+(int)point.x/2;
int j = (int)point.y%2 == 0 ?(int)point.y/2:1+(int)point.y/2;
NSString * res = [NSString stringWithFormat:@"{%d, %d}",i,j];
return res;
}

-(NSString *)castSpriteRect:(id)obj{
CGRect point = NSRectFromString((NSString *)obj);
int i = (int)point.origin.x%2 == 0 ?(int)point.origin.x/2:1+(int)point.origin.x/2;
int j = (int)point.origin.y%2 == 0 ?(int)point.origin.y/2:1+(int)point.origin.y/2;
int y = (int)point.size.width%2 == 0 ?(int)point.size.width/2:1+(int)point.size.width/2;
int x = (int)point.size.height%2 == 0 ?(int)point.size.height/2:1+(int)point.size.height/2;
NSString * res = [NSString stringWithFormat:@"{{%d, %d}, {%d, %d}}",i,j,y,x];
return res;
} 
0 голосов
/ 18 марта 2012

Причина, по которой вы в примере ничего не записываете, скорее всего, потому что ваши внутренние циклы for..in, вероятно, ищут в неправильном словаре: внешний цикл получает словарь sprite, поэтому внутренние циклы не должны искать ключи в что словарь?

Если вы хотите прочитать список свойств, изменить некоторые значения в нем и вывести обратно тот же список свойств, вам может быть полезно взглянуть на NSPropertyListSerialization class - он позволяет вам быстро получить структуру изменяемых массивов / словарей из plist-данных, так что вы можете перебирать их, как бы вы ни хотели изменить значения внутри, а затем снова сериализовать все обратно в данные.(Если вы используете dictionaryWithContentsOfFile:, вы получите изменяемый словарь, но все контейнеры в нем будут неизменными, поэтому вам придется делать mutableCopy и перебрасывать содержимое по всему месту во время итерации.)

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

...