2016-03-19 8 views
1

ich eine benutzerdefinierte Klasse oject, die ich NSUserDefaults mit speichern wollen, das ist, wie ich es zu speichern:Kann nicht Eigenschaften des Objekts zugreifen, nachdem es (Abstürze) kodiert

Shift.m

-(void)encodeWithCoder:(NSCoder*)encoder 
{ 
    [encoder encodeObject:self.date forKey:@"date"]; 
    [encoder encodeObject:self.startTime forKey:@"startTime"]; 
    [encoder encodeObject:self.endTime forKey:@"endTime"]; 
} 
- (id)initWithCoder:(NSCoder *)decoder { 
    if(self = [super init]) { 
     self.date = [decoder decodeObjectForKey:@"date"]; 
     self.startTime = [decoder decodeObjectForKey:@"startTime"]; 
     self.endTime = [decoder decodeObjectForKey:@"endTime"]; 
    } 
    return self; 
} 

MyTableViewController.m:

-(void)saveCustomObject:(id)object forKey:(NSString*)key 
{ 
    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object]; 
    [[NSUserDefaults standardUserDefaults] setObject:encodedObject forKey:key]; 
} 
-(NSArray*)getCustomObjectForKey:(NSString*)key 
{ 
    NSData *encodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:key]; 

    NSArray *shifts=[NSArray arrayWithObjects:[NSKeyedUnarchiver unarchiveObjectWithData:encodedObject], nil]; 

    return shifts; 
} 

es scheint es gut funktioniert, wenn das Debuggen, aber wh en Ich versuche eine der Objekteigenschaften zum Beispiel auf tableView: cellForRowAtIndexPath: so, zuzugreifen:

Shift *currentShift=[self.shifts objectForIndex:indexPath.row]; 
NSLog(@"%@",currentShift.startTime.description); 

es mit diesem Crash Nachricht stürzt:

2016-03-19 09:04:05.913 MyApp[9654:4249448] -[__NSArrayM startTime]: unrecognized selector sent to instance 0x7ff81b449c10 
2016-03-19 09:04:05.924 MyApp[9654:4249448] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM startTime]: unrecognized selector sent to instance 0x7ff81b449c10' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010e3e9e65 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x000000010de62deb objc_exception_throw + 48 
    2 CoreFoundation      0x000000010e3f248d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation      0x000000010e33f90a ___forwarding___ + 970 
    4 CoreFoundation      0x000000010e33f4b8 _CF_forwarding_prep_0 + 120 
    5 Mehuyavut count      0x000000010d95a8e8 -[shiftsTableViewViewController tableView:cellForRowAtIndexPath:] + 600 
    6 UIKit        0x000000010e8efe43 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 766 
    7 UIKit        0x000000010e8eff7b -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 74 
    8 UIKit        0x000000010e8c4a39 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2996 
    9 UIKit        0x000000010e8f901c -[UITableView _performWithCachedTraitCollection:] + 92 
    10 UIKit        0x000000010e8dfedc -[UITableView layoutSubviews] + 224 
    11 UIKit        0x000000010e84d4a3 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703 
    12 QuartzCore       0x000000011231959a -[CALayer layoutSublayers] + 146 
    13 QuartzCore       0x000000011230de70 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366 
    14 QuartzCore       0x000000011230dcee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 
    15 QuartzCore       0x0000000112302475 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277 
    16 QuartzCore       0x000000011232fc0a _ZN2CA11Transaction6commitEv + 486 
    17 QuartzCore       0x000000011233037c _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92 
    18 CoreFoundation      0x000000010e315367 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 
    19 CoreFoundation      0x000000010e3152d7 __CFRunLoopDoObservers + 391 
    20 CoreFoundation      0x000000010e30af2b __CFRunLoopRun + 1147 
    21 CoreFoundation      0x000000010e30a828 CFRunLoopRunSpecific + 488 
    22 GraphicsServices     0x0000000111ba6ad2 GSEventRunModal + 161 
    23 UIKit        0x000000010e796610 UIApplicationMain + 171 
    24 Mehuyavut count      0x000000010d95b5af main + 111 
    25 libdyld.dylib      0x0000000110b2592d start + 1 
    26 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Jeder weiß, warum?

Vielen Dank!

Antwort

0

Es scheint, als ob Sie wollen Shift *currentShift=[self.shifts objectForIndex:indexPath.row] geben Sie 1 Shift Objekt, aber was es wirklich tut, ist eine NSArray zurückgeben. Sie rufen grundsätzlich eine startTime Methode in NSArray, und da es nicht existiert, schlägt Ihr Programm fehl.

Es scheint wie NSLog(@"%@",currentShift.startTime.description) ist die Linie dabei. Bestätigen Sie durch Auskommentieren der NSLog. Es sollte dich nicht zum Absturz bringen. Wenn diese Hypothese in Ordnung ist, prüfen Sie, ob [currentShift isKindOfClass:[NSArray class]] wahr ist.

Wenn es ein Fehler, den Sie in dieser Zeile haben:

NSArray *shifts=[NSArray arrayWithObjects:[NSKeyedUnarchiver unarchiveObjectWithData:encodedObject], nil];

Sie auch nicht wirklich zeigen, wie Ihr - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section aussieht. Sie müssen dort die richtige Anzahl von Einträgen zurückgeben.

0

Sie machen self.shifts eine NSArray sein, aber Sie verwenden objectForKey, die für Wörterbücher verfügbar ist. Es ist nicht für Arrays verfügbar. Ich glaube du wolltest stattdessen objectAtIndex.

+0

Wo soll ich 'objectForKey:' in 'objectAtIndex' ändern? –

+0

Bevor indexpath.row ich denke ... –

+0

Sie haben 3 Ausschnitte gepostet. Einer von ihnen hat '' objectForKey: ''. Ändere dies. –

Verwandte Themen