-1

我有一个viewController人需要填写的地方textfields。当人们点击绿点时,他们会导航到另一个视图以做一个小签名,然后他们会回来。

在此处输入图像描述

我在这里遇到的问题是,当用户在此之后回来时,他们输入了他们的签名。我的文本字段中的值已经消失了。

就像您可以看到只有带 * 的文本字段是必须的。我尝试将这些值放入 aNSDictionary并将它们存储在NSUserdefaults. 但是,当我没有填写每个文本字段时,我会收到此错误。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: naam)'

解决这个问题的最佳方法是什么?

4

8 回答 8

1

原因:' * setObjectForKey: 对象不能为 nil (key: naam)'

解释:您不能NULLNSDictionary.

答:当你的textField值为时NULL,尝试将“”(空值)存储在 中NSDictionary

像这样执行检查:

if ([textField.text isEqualToString:@""] || textField.text.length == 0)
{
     [yourDict setObject:@"" forKey:@"someKey"];
}
于 2013-05-08T06:41:32.307 回答
1

您可以检查该密钥是否存在:

    NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];

    if ([defs objectForKey:@"naam"]) // Here it is YES if the key naam exists else no
    {
       // Key naam does exists
       // set that value in textfield
    }
    else
    {
    // Key naam does not exist
    }

希望它可以帮助你。

于 2013-05-08T06:42:53.277 回答
0
  1. 创建一个单例类。
  2. 将您的值放在那里(如果值为零,请输入“”作为该值)
  3. 回到控制器后获取值。
于 2013-05-08T06:44:52.423 回答
0

如果您在这种情况下尝试在字典中设置 NULL 值,您将收到此错误。所以请尝试使用这个。你应该对所有文本字段都这样做

if (naamTextField.text.lenght == 0)
     [dic setValue:@"" forKey:@"NAAM"];
else
     [dic setValue:naamTextField.text forKey:@"NAAM"];
if (emailTextField.text.lenght == 0)
     [dic setValue:@"" forKey:@"EMAIL"];
else
     [dic setValue:emailTextField.text forKey:@"EMAIL"];
于 2013-05-08T06:46:16.683 回答
0

添加这些methods以在store temporary data进入Temp Directoryretrieve离开时使用

#pragma mark
#pragma mark Data Save

// need a path
- (NSString *)getArrayPath
{
  //NSString* path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  return [NSTemporaryDirectory() stringByAppendingPathComponent:@"temp.dat"];
}

// save an array
- (void)saveVideoData:(NSMutableArray*)data
{
  [NSKeyedArchiver archiveRootObject:data toFile:[self getArrayPath]];
}

// get that array back
- (NSMutableArray *)loadSavedData
{
  return [NSKeyedUnarchiver unarchiveObjectWithFile:[self getArrayPath]];
}

保存值:例如。

 //create array
 NSMutableArray *arrValues = [NSMutableArray arrayWithObjects:txt1.text,txt2.text,txt3.text,nil];
 [self saveVideoData:arrValues];

获取值:例如。

 NSMutableArray *arrValues = [self loadSavedData];

通过在你中添加上述方法也another view controller可以得到data values there

于 2013-05-08T06:55:02.267 回答
0

仅存储具有值的文本字段。

-(void)textFieldDidEndEditing:(UITextField *)textField{
    NSMutableDictionary *dictionary = [NSMutableDictionary new];
    if(textField.text.length > 0){
      [dictionary setObject:textField.text forKey:@"<somekey>"];

      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
      [defaults setObject:dictionary forKey:@"<defaultKey>"];
      [defaults synchronize];
   }

}

并在您的 viewDidAppear 中加载从默认值中获取字典并显示它

于 2013-05-08T07:01:56.513 回答
0

对于您的问题,一个简单的解决方案可能是,就在pushing/presenting anotherViewController那时yourViewControllerpop/dismiss anotherViewController它仍然保持在原来的状态。所有字段都填充了以前的值。yourViewControlleranotherViewController

于 2013-05-08T07:02:44.227 回答
0

通常,如果您将您的viewController 推送/呈现给其他viewController 并弹出/关闭推送的Controller,通常文本字段中的值不会改变,直到您在ViewWillAppear 中编写某些内容...

这不应该发生!一般来说

于 2013-05-08T07:05:30.260 回答