2014-03-25 31 views
0

嗯,我不知道我的标题是否草拟得很好,但我会尽力解释我的问题,我想在NSUserDefaults中为IndexPath保存一个NSDate,这发生在viewWillDisappear但是它崩溃时,它的保存正确,因为当我重新打开DatePicker加载我想要的日期,但保存日期在UserDefaults 时仍然崩溃因此,继承人我的代码,所以你可以看到发生了什么事......如何查看NSUserdefaults是否为零?

我读如果NSUserDefaults是零或不,所以我可以加载DatePicker的:

NSArray *indexParams = [self.userdefaults objectForKey:@"indexpath"]; 
NSIndexPath *myIndexPath = [NSIndexPath indexPathForRow:indexParams[1] 
               inSection:indexParams[0]]; 

self.notificationDate = [self.userdefaults objectForKey:@"date"]; 
NSDate *date = [self.userdefaults objectForKey:[NSString stringWithFormat:@"%d", myIndexPath.row]]; 

if(date){ 
    [self.NotSwith setOn:YES]; 
    self.DatePicker.date = [self.userdefaults objectForKey:[NSString stringWithFormat:@"%d", myIndexPath.row]]; 



}else{ 
    [self.NotSwith setOn:NO]; 


    } 

当我要保存日期在viewWillDisappear其当崩溃发生:

NSArray *indexParams = [self.userdefaults objectForKey:@"indexpath"]; 
NSIndexPath *myIndexPath = [NSIndexPath indexPathForRow:indexParams[1] 
               inSection:indexParams[0]]; 

NSDate *date = [self.userdefaults objectForKey:[NSString stringWithFormat:@"%d", myIndexPath.row]]; 

if(date){ 
// [self.userdefaults synchronize]; 


} 

else{ 
    [self.userdefaults setObject:self.DatePicker.date forKey:[NSString stringWithFormat:@"%d", myIndexPath.row]]; 
    [self.userdefaults synchronize]; 
    [[UIApplication sharedApplication] scheduleLocalNotification:local]; 


} 

但成功保存的信息和日期选择器在重新启动时加载日期。

崩溃日志:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]' 

所以希望我解释好,谢谢!

设置indexpath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 



    NSNumber *section = [NSNumber numberWithInt:indexPath.section]; 
    NSNumber *rows = [NSNumber numberWithInt:indexPath.row]; 

    [self.userdefaults setObject:@[section, rows] forKey:@"indexpath"]; 
} 
+2

洛特是一个非常可怕的工作,可怕的代码。你能描述一下功能目标吗?为什么涉及索引路径?你只想保存一个日期或其他对象? – danh

+1

究竟是什么行是抛出的异常? – Paulw11

+0

根据didSelectRowAtIndexPath的索引路径保存日期,因此当您退出并重新打开时,您可以看到您何时设置了datePicker。这个日期选择器是为选中的tableview行显示的,我希望我解释一下,如果你能解释为什么它可能是一个可怕的代码,我会尽我所能开始我的工作,非常感谢 –

回答

0

听起来像是你想节省选定的指数路径和日期。在NSUserDefaults中保存日期很简单。

// no need to keep a property on self for user defaults. you don't need to keep 
// that around. just a stack variable will work. 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSDate *date = [NSDate date]; 

[defaults setObject:date forKey:@"myDate"]; 
[defaults synchronize]; 

拿回来以后是这样的:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSDate *date = [defaults objectForKey:@"myDate"]; 

// if nothing has been stored using that key then objectForKey will return nil 
if (date) { 
    // it's there! 
} else { 
    // it's not there 
} 

存储的索引路径是一个小更棘手,但是这将工作:

// wrap your row and section in NSNumbers, wrap those in an array for brevity 
NSNumber *section = [NSNumber numberWithInt:myIndexPath.section]; 
NSNumber *row = [NSNumber numberWithInt:myIndexPath.row]; 

[defaults setObject:@[section, row] forKey:@"myIndexPath"]; // then synchronize 

// naturally, when you get it later, you can check for nil again, and, 
// if it's not nil, to rebuild the index path... 

NSArray *indexParams = [defaults objectForKey:@"myIndexPath"]; 
NSIndexPath *myIndexPath = [NSIndexPath indexPathForRow:indexParams[1] 
               inSection:indexParams[0]]; 

的关键是什么ISN” t在这个答案中:没有NSData,没有NSKeyedArchiver,没有字符串操作来构建索引路径表示。祝你好运。

+0

它在第一次启动时工作,但现在在第二次启动时崩溃(相同的崩溃日志),并没有保存...你能帮助我吗?谢谢! –

+0

您可以设置异常断点(左侧的断点窗格,点击底部的加号)。然后,请张贴当前代码,尤其是发生崩溃的位置)。 – danh

+0

当我按照带有断点的应用程序流程时,我告诉你第一次启动是可以的,但第二次启动没有在viewWillDisappear之后保存日期和崩溃。我更新了代码,并在设置indexpath时添加了代码 –