2014-11-07 15 views
5

đây là bài đăng đầu tiên của tôi, vì vậy hãy xây dựng khi xem xét kỹ thuật đăng bài của tôi!Chia sẻ một mảng các đối tượng tùy chỉnh với Tiện ích mở rộng Hôm nay (tiện ích con) với NSUserDefaults

Về cơ bản, vấn đề của tôi là tôi có một loạt các đối tượng tùy chỉnh mà tôi cần chia sẻ với tiện ích mở rộng ngày hôm nay. Các đối tượng đại diện cho các tác vụ trong danh sách công việc phải làm và các thuộc tính của chúng được sử dụng để lưu trữ thông tin về từng tác vụ (tên, vị trí, thời gian, hình thu nhỏ, v.v.). Các đối tượng được lưu trữ trong một mảng được sử dụng để điền danh sách việc cần làm của tôi. Tất cả những gì tôi muốn làm là chuyển mảng này đến tiện ích của tôi để tôi có thể điền vào một chế độ xem bảng thứ hai sẽ hoạt động như một phiên bản thu gọn của phiên bản đầu tiên (cho chế độ xem tiện ích con).

Tôi nên chỉ ra rằng tiện ích của tôi được thiết lập đúng cách, như trong tôi đã liên kết chính xác ứng dụng và ứng dụng chứa trong 'nhóm'. Tôi cũng đã sử dụng thành công NSUserDefaults để vượt qua một loạt các NSStrings để các phụ tùng, tuy nhiên, khi tôi cố gắng để vượt qua các mảng của các đối tượng để các phụ tùng, nó bị treo và đăng nhập của tôi đọc:

*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (Xitem)' 

Tôi hiểu rằng tai nạn này có liên quan đến việc lưu trữ đối tượng (Xitem), mà dường như là một bước cần thiết để lưu các đối tượng tùy chỉnh trong NSUserDefaults. Tuy nhiên, tôi đã thử nghiệm lưu/tải mảng trong cùng một lớp của ứng dụng có chứa và hoạt động tốt! (mã bên dưới)

 NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self.Xitems]; 
     NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.AaronTest"]; 
     [defaults setObject:encodedObject forKey:@"myArray"]; 
     [defaults synchronize]; 


     NSUserDefaults *defaults2 = [[NSUserDefaults alloc] initWithSuiteName:@"group.AaronTest"]; 
     NSData *encodedObject2 = [defaults2 objectForKey:@"myArray"]; 
     NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject2]; 

     for (Xitem *t in array2){ 

      NSLog(@"*****%@*****", t.itemName); 
     } 

Được rồi giải thích như vậy, mã trên hoạt động như mong đợi. Tuy nhiên, khi tôi chèn thứ hai 'unarchiver' một nửa của mã này vào widget ngày hôm nay của tôi, tôi nhận được lỗi nói trên. Dưới đây là mã của tôi để hiển thị như thế nào tôi mã hóa/giải mã các đối tượng (có thể là đáng chú ý là đối tượng này được tạo ra cho sự đơn giản của gỡ lỗi của tôi và chỉ chứa một tài sản NSString):

Xitem.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 


@interface Xitem : NSObject <NSCoding> 
{ 
NSString *itemName; 
} 

-(void)encodeWithCoder:(NSCoder*)encoder; 
-(id)initWithCoder:(NSCoder*)decoder; 

@property NSString *itemName; 

@end 

Xitem.m

#import "Xitem.h" 

@implementation Xitem 

@synthesize itemName; 

-(void)encodeWithCoder:(NSCoder*)encoder 
{ 

[encoder encodeObject:self.itemName forKey:@"iName"]; 

} 

-(id)initWithCoder:(NSCoder*)decoder 
{ 

self = [super init]; 

self.itemName = [decoder decodeObjectForKey:@"iName"]; 

return self; 
} 

@end 

tôi cũng có thể gửi phụ tùng của tôi và có chứa mã ứng dụng, nhưng nó không khác so với tập đầu tiên của i mã được đăng (ngoài những biến đổi tên như 'defaults2'). Tôi nên chỉ ra rằng tôi thực sự có nguồn lực cạn kiệt trong khi cố gắng giải quyết vấn đề này, nhưng thực tế là sử dụng NSKeyedArchiver chỉ trong các công trình ứng dụng có chứa, đã để lại cho tôi stumped.

Tôi nhận thấy rằng this post rất giống với vấn đề của riêng tôi, nhưng tác giả quyết định chọn cách giải quyết, trong khi tôi thực sự muốn biết tại sao điều này không hiệu quả. Tôi là một nhà phát triển mới và tôi đang cố gắng hết mình để tiếp thu các phương pháp làm việc tốt nhất nên mọi lời khuyên sẽ được đánh giá cao.

Tôi nghĩ rằng cũng có thể thay thế đối tượng (lớp) của tôi bằng NSDictionary? Tuy nhiên tôi muốn tránh điều này nếu có thể bởi vì nó sẽ gây ra nhiều xung đột trong ứng dụng chính, nhưng rõ ràng nếu đó là phương pháp đúng, tôi sẽ giải quyết vấn đề đó. Một lưu ý phụ, nếu một từ điển tốt hơn một đối tượng cho các yêu cầu của tôi (danh sách việc cần làm với các thuộc tính của UIImage, CLLocation, vv) vì bất kỳ lý do nào khác (ví dụ như bộ nhớ hoặc khả năng truy cập), hãy giải thích và giúp tôi hiểu tại sao!

Cảm ơn rất nhiều về thời gian anyones :)

+0

Có ai có đầu vào cho tôi không?Tôi để lại vấn đề này sang một bên vì có vẻ như nó sẽ hoạt động theo cách này, nếu có ai biết tại sao nó không vui lòng chỉ nó cho tôi. Xin lỗi vì vết sưng nhưng đã hơn một tuần. – Swankzilla

Trả lời

3

OK vì vậy tôi vừa sửa lỗi này. Bất cứ ai cũng có cùng một vấn đề, hãy vào: 'Mục tiêu'> 'Widget'> 'Giai đoạn Xây dựng'> 'Biên dịch Nguồn'> thêm lớp tùy chỉnh ở đó (Xitem.m)

+0

cũng có cùng một vấn đề, nhưng sửa chữa này không nên làm việc cho tôi ... – kurtanamo

+0

Lưu ý rằng điều này sẽ kết thúc việc thêm bản sao không cần thiết vào gói ứng dụng của bạn; bạn đang xây dựng hiệu quả hai tệp đối tượng riêng biệt được liên kết nội tuyến với ứng dụng của bạn và tiện ích ứng dụng của bạn. Không phải là một thỏa thuận lớn cho các ứng dụng nhỏ hơn, nhưng lặp lại mẫu này có thể phát triển nhị phân của bạn nhiều hơn mức cần thiết. Cuối cùng, tôi nghĩ rằng một mô hình dài hạn tốt hơn sẽ là làm một việc gì đó như trích xuất mã (common-between-App-and-App-Extension) của bạn thành một Framework, sau đó liên kết cả ứng dụng của bạn ** và ** App Extension cho Khung. – fullofsquirrels

Các vấn đề liên quan