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.
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