2013-05-08 51 views
-1

我有一个viewController人们需要填写一些textfields。当人们在绿地上点击时,他们会转向另一个视图以签署一个小签名,然后他们回来。在某处短时间存储UITextFields值

enter image description here

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

就像你可以看到只有带*的文本域是有义务的。我试着将这些值放在NSDictionary中,并将它们存储在NSUserdefaults中。但是当我没有填满每个文本字段时,我会得到这个错误。

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

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

回答

0

做这样的添加这些methods使用时store temporary dataTemp 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 valuesthere也。

+0

这解决了我的问题。我想我会更频繁地使用它!好的解决方法! – Steaphann 2013-05-08 07:41:23

1

原因: '* setObjectForKey:对象不能是零(关键:NAAM)'

说明:你不能在你的NSDictionary设置NULL值。

答:当你textFieldNULL,尝试存储“”(空值)NSDictionary

表演检定这样的:

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

我仍然得到这个错误终止应用程序由于未捕获异常'NSInvalidArgumentException',原因:'*** setObjectForKey:对象不能为零(键:adres)' – Steaphann 2013-05-08 06:59:44

+0

@StefGeelen:尝试添加一个更多的条件到你的If声明。再次检查我的代码。你必须检查所有的TextFields。 – Bhavin 2013-05-08 07:03:49

+0

@StefGeelen:同时检查BreakPoints,你可以在这行''yourDict setObject:@“”forKey:@“someKey”];'或不当你的textField为空。 – Bhavin 2013-05-08 07:13:00

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 
    } 

希望它可以帮助你。

0
  1. 创建一个单例类。
  2. 将你的值放在那里(如果值为零,则为该值输入“”)
  3. 一旦你回到控制器就取回该值。
0

如果你正试图在字典中设置NULL值,那么你会得到这个错误。所以,请尽量使用这个one.And你应该为所有的文本字段

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"]; 
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只加载取从默认字典,并显示它

0

为您的问题的一种简单的解决方案可以是,仅仅pushing/presenting超过yourViewControlleranotherViewController然后pop/dismissanotherViewController作为yourViewControlleranotherViewController的根部,因此它仍然保持在它之前的状态。所有字段都填充了以前的值。

0

一般来说,如果你推/本yourviewController到其他的viewController和POP/dimiss,推高控制器,通常在文本字段中的值,直到你写的东西viewWillAppear中不改变...

这是不应该的!一般