2012-04-19 32 views
1

我使用下面的代碼將我的「自定義按鈕」存儲在NSUserdefaults中。但是,在將對象轉換爲NSdata時,出現「[UIImage encodeWithCoder:]:無法識別的選擇器發送到實例」的錯誤。此處的「自定義按鈕」爲UIButton類。有人知道爲什麼...?請幫幫我。在NSUserdefaults問題中存儲custom_button?

Custom_button *lock11 = (Custom_button*)[menu1 viewWithTag:100]; 
       NSLog(@"opened lock1 ========= %@",lock11); 
       lock11.is_menu_lock_opened = YES; 

       NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:lock11]; //[NSKeyedArchiver archivedDataWithRootObject:lock11]; 
       [prefs setObject:myEncodedObject forKey:@"set1lock"]; 

回答

2

這種方法落實到你的Custom_button類

的initWithCoder和encodeWithCoder所有對象

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

     self = [[CastInnerListData alloc] init]; 
     if (self != nil) {  
      self.object1 = [coder decodeObjectForKey:@"object1"]; 
      self.object2 = [coder decodeObjectForKey:@"object2"];  
    } 
    return self; 
} 

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

     [coder encodeObject:object1 forKey:@"object1"]; 
     [coder encodeObject:object2 forKey:@"object2"]; 
} 

For more detail click here

3

的NSUserDefaults的類提供了訪問 常見的類型,比如花車方便的方法,雙打,整數,布爾和網址。 A 默認對象必須是一個屬性列表,也就是,一個實例(或針對集合的一個實例組合)(實例的組合):NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果要存儲任何其他類型的對象,則通常應將其存檔以創建一個NSData實例。

不直接映射到屬性列表對象的對象變成NSData通過發送一個編碼器並對其內容進行編碼。 [UIImage encodeWithCoder:]。他們需要符合NSCoding協議才能正常工作。你會發現UIImage沒有在iOS 5之前確認NSCoding協議。如果你想在iOS 5之前部署,你將不得不自己動手做一些事情,在自定義按鈕類中實現NSCoding並以不同的方式存儲該圖像。

+0

你說什麼和我發佈的內容有什麼不同? – Lefteris 2012-04-19 12:08:04