我对Objective c很陌生。在我的应用程序中,我想将一个由 NSString 和来自三个分段控件的三个 NSInteger 令牌组成的对象保存在 .plist 文件中。它在 32 位模拟器和设备上运行良好,但在 64 位中传递了一个空对象,因为我猜是 NSCoder。在我的对象类中,我实现了这两种方法:
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject: self.cardPath forKey:@"cardPath"];
[coder encodeInteger: (NSInteger) self.cardSign forKey:@"cardSign"];
[coder encodeInteger: (NSInteger) self.cardNumber forKey:@"cardNumber"];
[coder encodeInteger: (NSInteger) self.cardColor forKey:@"cardColor"];
}
- (id)initWithCoder:(NSCoder *)coder {
self.cardPath = [coder decodeObjectForKey:@"cardPath"];
self.cardSign = (NSInteger*) [coder decodeIntegerForKey: @"cardSign"];
self.cardNumber = (NSInteger*) [coder decodeIntegerForKey:@"cardNumber"];
self.cardColor = (NSInteger*) [coder decodeIntegerForKey:@"cardColor"];
return self;
}
我从分段控件中获取值:
cardSelected.cardSign = [NSNumber numberWithInteger:[sender selectedSegmentIndex]];
和
cardSelected.cardNumber = [NSNumber numberWithInt:[sender selectedSegmentIndex]];
我比较喜欢:
cardSelected.cardColor = [NSNumber numberWithInt:[sender selectedSegmentIndex]];
if ([cardSelected.cardColor intValue] == 0)
{
[iBack setImage: [UIImage imageNamed: @"5_0.png"]];
NSLog(@"red");
}
我保存对象:
'-(IBAction)game:(id)sender
{
NSMutableArray *cards = [[NSMutableArray alloc] initWithObjects: cardSelected, nil];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cards];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"cards"];
[data writeToFile:path atomically:YES];}'
我尝试以这种方式在 viewDidLoad 方法中检索保存的对象
- (void)viewDidLoad
{
[super viewDidLoad];
// testing for 64bit at runtime
if (sizeof(void*) == 4) {
NSLog(@"You're running in 32 bit");
} else if (sizeof(void*) == 8) {
NSLog(@"You're running in 64 bit");
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
path = [[NSString alloc]initWithString:[paths[0]stringByAppendingPathComponent:@"selectedCard.plist"]];
if([[NSFileManager defaultManager]fileExistsAtPath:path])
{
segSign.momentary = NO;
segNumber.momentary = NO;
segColor.momentary = NO;
[segSign addTarget:self action:@selector(segmentedSign:) forControlEvents: UIControlEventValueChanged];
[segNumber addTarget:self action:@selector(segmentedNumber:) forControlEvents: UIControlEventValueChanged];
[segColor addTarget:self action:@selector(segmentedColor:) forControlEvents: UIControlEventValueChanged];
NSData *cardsData = [[NSUserDefaults standardUserDefaults] objectForKey:@"cards"];
NSMutableArray *cards = [NSKeyedUnarchiver unarchiveObjectWithData:cardsData];
cardSelected = [cards objectAtIndex:0];
//NSLog(@"%li",cardSelected.cardNumber);
if ([cardSelected.cardColor intValue] == 0)
{
[iBack setImage: [UIImage imageNamed: @"5_0.png"]];
NSLog(@"red");
}
if ([cardSelected.cardColor intValue] == 1)
{
[iBack setImage: [UIImage imageNamed: @"5_1.png"]];
NSLog(@"blue");
}
[segSign setSelectedSegmentIndex: [cardSelected.cardSign intValue]];
NSLog(@"check sign...%i", [cardSelected.cardSign intValue]); //always display 1
NSLog(@"double-check...%@", cardSelected.cardSign); //always display 1
[segNumber setSelectedSegmentIndex: [cardSelected.cardNumber intValue]];
[segColor setSelectedSegmentIndex: [cardSelected.cardColor intValue]];
} else
{
NSLog(@"else");
Card *i = [[Card alloc]init];
i.cardSign = 0;
i.cardNumber = 0;
i.cardPath = @"0_0.png";
[iBack setImage: [UIImage imageNamed: @"5_0.png"]];
cardSelected = i;
}
[iImage setImage: [UIImage imageNamed : cardSelected.cardPath]];
// Do any additional setup after loading the view, typically from a nib.
}
cardSelected 是一个带有 .h 文件的对象 Card:
@interface Card : NSObject <NSCoding>
{
NSNumber *cardSign, *cardNumber, *cardColor;
NSString *cardPath;
}
@property (nonatomic) NSNumber *cardSign, *cardNumber, *cardColor;
@property (nonatomic, strong) NSString *cardPath;
@property (nonatomic, strong) NSCoder *coder, *encoder;
@end
和实现 .m 文件为
'
@interface Card : NSObject { NSNumber *cardSign, *cardNumber, *cardColor; NSString *cardPath;
}
@property (nonatomic) NSNumber *cardSign, *cardNumber, *cardColor;
@property (nonatomic, strong) NSString *cardPath;
@property (nonatomic, strong) NSCoder *coder, *encoder;
@end
' 使用对象 (Card) *cardSelected 时,它没有预期值。我究竟做错了什么?