我使用NSUserDefaults来存储值。我在NSUserDefaults中存储了一些整数值,如下面的第一个视图中所示。
我在接口文件中声明如下..
NSUserDefaults *prefs;
@property(nonatomic,retain) IBOutlet NSUserDefaults *prefs;
然后我在课堂文件中使用如下
@synthesize passwordfield,prefs;
这里的密码字段是UITextField的名称
NSInteger myInteger = [passwordfield.text integerValue];
[prefs setInteger:myInteger forKey:@"integerKey"];
[prefs synchronize];
NSInteger myInt = [prefs integerForKey:@"integerKey"];
NSLog(@"My integer Value: %d",myInt);
然后我使用导航控制器移动到下一个视图。
但我无法从第一个视图中读取NSUserDefaults的值。
我在第二个视图中使用了如下代码。
PasswordCheckViewController *nextController = [[PasswordCheckViewController alloc] initWithNibName:@"PasswordCheckViewController" bundle:nil];
NSLog(@"Pass in Next: %d",[nextController.prefs integerForKey:@"integerKey"]);
但输出如下。
Pass in Next: 0
如何使用NSUserDefaults从第一个视图获取第二个视图的值?
答案 0 :(得分:4)
您正在做的是错误的,NSUserDefaults
不是IBOutlets
,IBOutlet
用于引用InterfaceBuilder控件。
NSUserDefault
通常用于存储一些偏好值
通常,您通过调用NSUserDefaults
类方法来使用standardUserDefaults
类来获取NSUserDefaults对象。此方法返回一个全局NSUserDefaults
对象,其搜索列表已初始化。使用objectForKey:
和setObject:forKey:
方法获取和设置默认值。请注意,默认值的值只能是属性列表对象:NSData
,NSString
,NSNumber
,NSDate
,NSArray
或NSDictionary
在您的情况下,您正在创建一个不需要的IBOutlet
。这样做
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSInteger myInteger = [passwordfield.text integerValue];
[prefs setObject:myInteger forKey:@"integerKey"];
NSInteger myInt = [prefs objectForKey:@"integerKey"];
这将为您提供同步NSUserDefaults
,这样您就不需要将任何东西存储为ivar
您可以从应用程序内的任何类访问对象的值
答案 1 :(得分:1)
您正在混合视图和视图控制器。因此,您可以从导航控制器获取所需的视图控制器,并在视图未卸载的情况下从中获取所需的视图。 例如,如果self是第二个视图控制器,并且您想要从第一个视图控制器读取:
MyFirstViewController *vc = (MyFirstViewController*)[self.navigationController.viewControllers objectAtIndex: indexOfFirst];
// ... now copy your prefs from first to second
self.prefs = vc.prefs;
答案 2 :(得分:0)
在需要使用NSUserDefaults
获取值的函数中使用此代码:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSInteger myInt = [prefs integerForKey:@"a"];