将UITextFields值存储在某个地方很短的时间

时间:2013-05-08 06:38:33

标签: iphone ios objective-c uiviewcontroller nsuserdefaults

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

enter image description here

我在这里遇到的问题是,当用户回来后,​​他们进入了他们的签名。我的文本域中的值已经消失了。

就像你只能看到带有*的文本字段一样。我已尝试将这些值放在NSDictionary中并将其存储在NSUserdefaults中。但是当我没有填写每个文本字段时,我得到了这个错误。

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

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

8 个答案:

答案 0 :(得分:1)

  

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

说明:您无法在NULL中设置NSDictionary值。

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

执行以下检查:

if ([textField.text isEqualToString:@""] || textField.text.length == 0)
{
     [yourDict setObject:@"" forKey:@"someKey"];
}

答案 1 :(得分: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
    }

希望它对你有所帮助。

答案 2 :(得分:0)

  1. 创建一个单例类。
  2. 将您的值放在那里(如果值为nil,则为该值输入“”)
  3. 返回控制器后获取值。

答案 3 :(得分: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"];

答案 4 :(得分: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

答案 5 :(得分: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中加载从默认值中获取字典并显示它

答案 6 :(得分:0)

针对您的问题的简单解决方案可能是pushing/presenting anotherViewController超过yourViewController然后pop/dismiss anotherViewController因为yourViewController位于{ anotherViewController因此它仍然保持在以前的状态。所有字段都填充了以前的值。

答案 7 :(得分:0)

通常,如果你将yourviewController推送/提供给推送Controller的其他viewController和pop / dimiss,通常文本字段中的值不会改变,直到你在ViewWillAppear中写一些东西......

这不应该发生!!通常