Objecitive C - 如何将SecondVC标签文本发送到FirstVC并更新FirstVC标签文本

时间:2016-01-21 06:57:26

标签: ios objective-c

在我的情况下有两个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;
}

我在第一个视图中使用此方法获取值,并且我想更新第一个视图的值,但它没有工作。

5 个答案:

答案 0 :(得分:2)

有很多种方法

  1. 使用protocol-delegate - 完美的方式
  2. 在secondVC中为它创建协议的正确和完美的方式,并添加一个弱属性作为委托,并在呈现secondVC时..将firstVC指定为secondVC的委托。另外,在firstVC中实现该协议。现在当您解雇secondVC时,请在协议中调用该方法。并且在firstVC中实现的方法被调用..所以你得到那里的值。

    1. 使用NSNotification
    2. 您可以在firstVC中添加观察者通知,从secondVC添加postNotification。但这不是正确的方式......因为firstVC会持续观察通知。 (不要忘记删除观察者......一旦你不需要观察)

      1. 使用Global variable
      2. 您可以在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方法coredatansnotificationsnsuserdefaults等多种方式来完成。从所有这些,向后传递数据的最简单方法之一,我们可以轻松使用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方法中它将起作用。