2012-02-18 27 views
5

Tôi đang tiết kiệm một mảng của các đối tượng tùy chỉnh cho một danh sách tập tin plist như vậy:Làm thế nào để sử dụng arrayWithContentsOfFile để tải tập tin văn bản thành công với writeToFile trong ObjectiveC/XCode

+(void) arrayToPlist: (NSArray*) plant_types{ 
    NSMutableArray* dictionary_array = [NSMutableArray arrayWithCapacity: plant_types.count]; 

    for(int i = 0; i<plant_types.count; i++){ 
     PlantType* pt = [plant_types objectAtIndex: i]; 
     [dictionary_array addObject: [pt toDict]]; 
    } 

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString* filePath = [rootPath stringByAppendingPathComponent:@"PlantTypes.plist"]; 
    NSLog(@"Writing plist to: %@", filePath); 

    [dictionary_array writeToFile: filePath atomically: YES]; 
} 

nào tạo ra một tập tin mà trông giống như:

<?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>name</key> 
     <string>Autumn Olive</string> 
     <key>radius</key> 
     <real>10</real> 
    </dict> 
    <dict> 
     <key>name</key> 
     <string>Dwarf Cherry</string> 
     <key>radius</key> 
     <real>5</real> 
    </dict> 
    <dict> 
     <key>name</key> 
     <string>Bamboo</string> 
     <key>radius</key> 
     <real>2</real> 
    </dict> 
    <dict> 
     <key>name</key> 
     <string>Pomegranate</string> 
     <key>radius</key> 
     <real>6</real> 
    </dict> 
    <dict> 
     <key>name</key> 
     <string>Lupin</string> 
     <key>radius</key> 
     <real>0.60000002384185791</real> 
    </dict> 
</array> 
</plist> 

Và tải chúng theo cách này:

+(NSMutableArray*) arrayFromPlist{ 
    NSLog(@"Loading array of plant types from plist."); 

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString* filePath = [rootPath stringByAppendingPathComponent:@"PlantTypes.plist"]; 
    NSFileManager* fileManager = [NSFileManager defaultManager]; 

    if([fileManager fileExistsAtPath:filePath]){ 
     NSLog(@"Plist file exists at expected location."); 
     NSMutableArray* plant_dicts = [NSMutableArray arrayWithContentsOfFile:filePath]; 
     NSLog(@"Loaded array with contents of file, got %d plant types.", plant_dicts.count); 
     NSMutableArray* plant_types = [NSMutableArray arrayWithCapacity: plant_dicts.count]; 
     for(int i = 0; i< plant_dicts.count; i++){ 
      NSMutableDictionary* dict = [plant_dicts objectAtIndex: i]; 
      [plant_types addObject: [PlantType fromDict: dict]]; 
     } 
     return plant_types; 
    } 
    NSLog(@"Plant Type plist file not found."); 
    return NULL; 
} 

Nothings đâm, nhưng mỗi khi tôi trả lại một số NSMutableArray có kích thước bằng không (và câu lệnh khai báo đó xác nhận rằng plant_dicts có kích thước bằng không).

Tôi đang làm gì sai? Tất cả các vấn đề tương tự tôi thấy với arrayWithContentsOfFile: là những người tạo ra plist bằng tay hoặc với một biên tập viên ... Tôi nghĩ rằng việc làm cho nó từ mã chính nó sẽ không có những vấn đề này ...

Edit: I đã xác nhận rằng tôi không còn nhận được kết quả không có kích thước bằng 0 (điều này thật lạ, không có thay đổi mã nào trong phần đó kể từ bài đăng gốc). Tuy nhiên, tôi vẫn không tải đúng. Đây là phương thức fromDict và toDict của tôi.

Vấn đề là chuỗi "hình dạng" dường như không tải đúng. Ít nhất, khi tôi hỏi nếu hình dạng == @ "Circle" tôi nhận được rằng nó không, ngay cả khi nó rõ ràng không trong tuyên bố NSLog. Tôi đang thực hiện một so sánh giống hệt nhau ở nơi khác trong mã (khi kiểm tra làm thế nào để render đối tượng) và nó hoạt động tốt ở đó (vì vậy tôi giả sử không có một số == vs .equals lạ như có trong Java).

Chỉnh sửa đôi: Chờ, không có [shape isEqualToString: @ "Circle"] .... tại sao tôi không cần sử dụng nó trước khi gây nhầm lẫn cho tôi, nhưng việc thêm nó ở đây sẽ giúp ích.

+0

Yeah, với chuỗi bạn muốn làm isEqualToString, với lý do tương tự như trong Java. == chỉ kiểm tra xem con trỏ có giống nhau hay không, không phải nội dung của chuỗi. Điều đó == đã làm việc trong mã render của bạn bởi vì trình biên dịch biết nó có thể sử dụng cùng một con trỏ cho hai cá thể của cùng một chuỗi. Nhưng nếu một trong những chuỗi đó xuất phát từ một plist, nó sẽ là một con trỏ khác. – davehayden

Trả lời

4

Với plist của bạn, mã này trả về một kết quả chính xác

+(NSMutableArray*) arrayFromPlist{ 
    NSLog(@"Loading array of plant types from plist."); 

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString* filePath = [rootPath stringByAppendingPathComponent:@"PlantTypes.plist"]; 
    NSFileManager* fileManager = [NSFileManager defaultManager]; 

    if([fileManager fileExistsAtPath:filePath]){ 
     NSLog(@"Plist file exists at expected location."); 
     NSMutableArray* plant_dicts = [NSMutableArray arrayWithContentsOfFile:filePath]; 
     NSLog(@"Loaded array with contents of file, got %d plant types.", plant_dicts.count); 
     NSMutableArray* plant_types = [NSMutableArray arrayWithCapacity: plant_dicts.count]; 
     for(int i = 0; i< plant_dicts.count; i++){ 
      NSMutableDictionary* dict = [plant_dicts objectAtIndex: i]; 
      [plant_types addObject: dict]; 
     } 
     return plant_types; 
    } 
    NSLog(@"Plant Type plist file not found."); 
    return NULL; 
} 

kết quả

2012-02-22 16:24:43.697 Test[5574:10103] Loading array of plant types from plist. 
2012-02-22 16:24:43.698 Test[5574:10103] Plist file exists at expected location. 
2012-02-22 16:24:43.699 Test[5574:10103] Loaded array with contents of file, got 5 plant types. 
2012-02-22 16:24:43.700 Test[5574:10103](
     { 
     name = "Autumn Olive"; 
     radius = 10; 
    }, 
     { 
     name = "Dwarf Cherry"; 
     radius = 5; 
    }, 
     { 
     name = Bamboo; 
     radius = 2; 
    }, 
     { 
     name = Pomegranate; 
     radius = 6; 
    }, 
     { 
     name = Lupin; 
     radius = "0.6000000238418579"; 
    } 
) 

Tôi nghĩ rằng vấn đề xuất phát từ thực hiện PlantType của bạn. bạn có thể gửi mã của bạn (toDict và fromDict phương pháp)

0

dòng này:

NSMutableDictionary* dict = [plant_dicts objectAtIndex: i]; 

không trả lại một cuốn từ điển có thể thay đổi, nhưng là một bất biến.

Nếu bạn muốn nó được có thể thay đổi, bạn nên làm một cái gì đó dọc theo những dòng:

MutableDictionary* dict = [NSMutableDictionary dictionaryWithDictionary: [plant_dicts objectAtIndex: i]]; 
Các vấn đề liên quan