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; 
} 

我得到与在第一视图中此方法的值,并我想更新第一个视图的值,但它不起作用。

+0

你在哪里调用了 - (NSString *)testingAsign方法在firstviewcontroller? – riddhi

+0

我在第二个视图的'viewdidload'和'viewwillappear'尝试过它 –

+0

我更新了我的问题 –

这可以用很多方法完成,如使用delegate方法coredata,nsnotificationsnsuserdefaults。从所有这些,向后传递数据的最简单方法之一,我们可以很容易地使用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; 
} 
+0

这不起作用。事情是如果我去'第二个视图'和什么时候'解散',我的第一个视图'确实不会再次加载。 –

+0

我认为这是因为我使用'over current context'作为segue的'presentation'。如果我将其更改为'currnent context'之类的任何其他内容,它在此正常工作 –

您不需要为此使用NSUSerDefaults。如果你想要做的就是能够在segue上传输数据,那么你需要使用prepareForSegue函数的。检出https://stackoverflow.com/a/7865100/2465172

+0

,我发送数据'backward'而不是'转发' –

您在哪种方法更新FirstViewController,ViewDidLoad或ViewWillAppear方法?做[[NSUserDefaults standardUserDefaults] @“1”forKey:@“adultcount”]; [[NSUserDefaults standardUserDefaults] synchronize];在SecondViewController中,当您关闭SecondViewController时,从FirstViewController.Hope的ViewWillAppear方法中的NSUserDefaults中获取更新的值,它将起作用。

有很多方法来此是

  1. 利用protocol-delegate - 完美的方式

正确和完美的方式,它在secondVC为它创建协议,并添加一个弱财产委托,并在呈现第二VC时将第一VC分配为第二VC的代表。另外,在firstVC中实现该协议。现在,当您解散secondVC时,请在协议中调用该方法。在firstVC中实现的方法被调用..所以你在那里得到的价值。

  1. 通过使用NSNotification
  2. 您可以在从secondVC firstVC和postNotification通知添加观察者。但这不是正确的方式。正如第一个VC持续观察通知一样。 (不要忘记删除观察者..一旦你不要需要观察)

    1. 通过使用Global variable
    2. 您可以添加的appDelegate一个全局变量,并分配从secondVC它的价值。并从firstVC访问该值。这也不是正确的方法。因为该变量总是保留在内存中。

    开始=>
开始=>
+0

这是完全错误的方式..为传递运行时变量值,我们不应该使用内存..我的意思是保存在NSUserDefaults来当你想保存甚至杀死应用程序后。我的意思是如果你想保持持久记忆的细节..否则为此目的,这是完全错误的。 –