在我的情况下有两个ViewControllers
。在我的第一个视图控制器中有一个标签,当查看加载时,它的文本应显示为1
。然后有一个按钮,当它点击时,导航到第二个视图控制器。在第二个视图中,有一个步进器和标签。如果用户点按+
,则第二个视图的标签文字会从1
更改为9
,而-
也会相同(减少该值)。在第二个视图中还有一个按钮。当它点击时,第二个视图关闭(从第一个视图到第二个我使用presend Modally
种类segue与over Current Context
演示文稿。这意味着当关闭此第二个视图时,firstview确实不再加载,它存在于后台)。所以我想要的是发送第二个视图的标签文本(在步进器更改后),作为第一个视图的文本并更新第一个视图的标签。(想想第二个视图&# 39; s标签文字为3
,第一个视图的标签文字应从1
更新为3
)。我尝试使用NSUserdefaults
。这是我的代码。
这是我的第二个视图控制器
- (void)viewDidLoad {
[super viewDidLoad];
//set default value for adult label
NSUInteger defaultAdultVal = self.adultstepper.value;
self.adultcountLabel.text = [NSString stringWithFormat:@"%d", defaultAdultVal];
}
- (IBAction)adultcountAction:(UIStepper *)sender {
NSUInteger adultVal = sender.value;
self.adultcountLabel.text = [NSString stringWithFormat:@"%d", adultVal];
NSString *adultCount = [NSString stringWithFormat:@"%d", adultVal];
[[NSUserDefaults standardUserDefaults] setObject:adultCount forKey:@"adultcount"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (IBAction)DoneAction:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
这是我的第二个视图控制器
- (NSString *)testingAsign
{
NSString *adltCount = [[NSUserDefaults standardUserDefaults] objectForKey:@"adultcount"];
return adltCount;
}
我在第一个视图中使用此方法获取值,并且我想更新第一个视图的值,但它没有工作。
答案 0 :(得分:2)
有很多种方法
protocol-delegate
- 完美的方式在secondVC中为它创建协议的正确和完美的方式,并添加一个弱属性作为委托,并在呈现secondVC时..将firstVC指定为secondVC的委托。另外,在firstVC中实现该协议。现在当您解雇secondVC时,请在协议中调用该方法。并且在firstVC中实现的方法被调用..所以你得到那里的值。
NSNotification
您可以在firstVC中添加观察者通知,从secondVC添加postNotification。但这不是正确的方式......因为firstVC会持续观察通知。 (不要忘记删除观察者......一旦你不需要观察)
Global variable
您可以在appDelegate中添加一个全局变量,并从secondVC分配其值。并从firstVC访问该值。这也不是正确的方法。因为该变量始终保留在内存中。
答案 1 :(得分:0)
当在NSUserDefaults中设置值后第二个视图控制器关闭时,尝试在视图中添加来自userdefault的值将出现在第一个视图控制器中。
- (void) viewDidLoad:(BOOL)animated{
[super viewDidLoad:animated];
[[NSUserDefaults standardUserDefaults] @"1" forKey:@"adultcount"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
myStaticLabel.text = testingAsign;
}
- (NSString *)testingAsign
{
NSString *adltCount = [[NSUserDefaults standardUserDefaults] objectForKey:@"adultcount"];
return adltCount;
}
答案 2 :(得分:0)
这可以通过使用delegate
方法coredata
,nsnotifications
和nsuserdefaults
等多种方式来完成。从所有这些,向后传递数据的最简单方法之一,我们可以轻松使用NSUserDefaults
。这是使用nsuserdefaults
传递数据反向搜索的示例项目。使用这个github项目并尝试一下。 project url:pass data backward using NSUserDefaults in ios, objective C
答案 3 :(得分:-1)
您不需要NSUSerDefaults。如果你想要做的就是能够在segue上传输数据,你需要使用 prepareForSegue 函数。查看https://stackoverflow.com/a/7865100/2465172
答案 4 :(得分:-1)
您在FirstViewController,ViewDidLoad或ViewWillAppear方法中更新哪种方法? [[NSUserDefaults standardUserDefaults] @“1”forKey:@“adultcount”]; [[NSUserDefaults standardUserDefaults] synchronize];在SecondViewController中,当您解除SecondViewController时,从ViewWillAppear中获取更新值,在ViewWillAppear FirstViewController.Hope方法中它将起作用。