Objecitive C - 如何发送SecondVC标签文本到FirstVC并更新FirstVC标签文本
在我的情况下有两个ViewControllers
。在我的第一个视图控制器中有一个标签,当视图加载时,它的文本应显示为1
。然后有一个按钮,当它点击时,导航到第二个视图控制器。在第二个视图中,有一个步进器和标签。如果用户点击+
,则第二个视图的标签文本从1
更改为9
,对于-
也相同(降低该值)。在第二个视图中还有一个按钮。当它点击时,第二个视图解除(从第一个视图到第二个我使用presend Modally
种类segue与over Current Context
presentation.that意味着当解散此secondview时,firstview不会再次加载,它存在于背景)。所以我想要的是发送第二个视图的标签文本(经步进器更改后)作为第一个视图的文本并更新第一个视图的标签(想想如果第二个视图的标签文本是3
,第一个视图的标签文本应该从1
更新到3
)。我试着用NSUserdefaults
。这是我的代码。Objecitive C - 如何发送SecondVC标签文本到FirstVC并更新FirstVC标签文本
这是我的第二视图控制器
- (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;
}
我得到与在第一视图中此方法的值,并我想更新第一个视图的值,但它不起作用。
这可以用很多方法完成,如使用delegate
方法coredata
,nsnotifications
和nsuserdefaults
。从所有这些,向后传递数据的最简单方法之一,我们可以很容易地使用NSUserDefaults
。这是一个使用nsuserdefaults
传递数据后退的示例项目。使用这个github项目并尝试一下。项目地址:pass data backward using NSUserDefaults in ios, objective C
当第二个视图控制器在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;
}
这不起作用。事情是如果我去'第二个视图'和什么时候'解散',我的第一个视图'确实不会再次加载。 –
我认为这是因为我使用'over current context'作为segue的'presentation'。如果我将其更改为'currnent context'之类的任何其他内容,它在此正常工作 –
您不需要为此使用NSUSerDefaults。如果你想要做的就是能够在segue上传输数据,那么你需要使用prepareForSegue函数的。检出https://stackoverflow.com/a/7865100/2465172
,我发送数据'backward'而不是'转发' –
您在哪种方法更新FirstViewController,ViewDidLoad或ViewWillAppear方法?做[[NSUserDefaults standardUserDefaults] @“1”forKey:@“adultcount”]; [[NSUserDefaults standardUserDefaults] synchronize];在SecondViewController中,当您关闭SecondViewController时,从FirstViewController.Hope的ViewWillAppear方法中的NSUserDefaults中获取更新的值,它将起作用。
有很多方法来此是
- 利用
protocol-delegate
- 完美的方式
正确和完美的方式,它在secondVC为它创建协议,并添加一个弱财产委托,并在呈现第二VC时将第一VC分配为第二VC的代表。另外,在firstVC中实现该协议。现在,当您解散secondVC时,请在协议中调用该方法。在firstVC中实现的方法被调用..所以你在那里得到的价值。
- 通过使用
NSNotification
- 通过使用
Global variable
您可以在从secondVC firstVC和postNotification通知添加观察者。但这不是正确的方式。正如第一个VC持续观察通知一样。 (不要忘记删除观察者..一旦你不要需要观察)
您可以添加的appDelegate一个全局变量,并分配从secondVC它的价值。并从firstVC访问该值。这也不是正确的方法。因为该变量总是保留在内存中。
这是完全错误的方式..为传递运行时变量值,我们不应该使用内存..我的意思是保存在NSUserDefaults来当你想保存甚至杀死应用程序后。我的意思是如果你想保持持久记忆的细节..否则为此目的,这是完全错误的。 –
你在哪里调用了 - (NSString *)testingAsign方法在firstviewcontroller? – riddhi
我在第二个视图的'viewdidload'和'viewwillappear'尝试过它 –
我更新了我的问题 –