解雇视图时如何刷新我的UILabel?

时间:2013-03-07 23:27:26

标签: objective-c xcode uiviewcontroller

我目前正在使用此代码来关闭故事板表格视图,用户可以在其中进行应用程序内购买以呈现.xib,这是我的应用程序的主视图,并显示UILabel中的总信用额度。问题在于,他们刚刚通过购买添加的新积分总额此时未显示在UILabel中。一旦我完全关闭应用程序并重新打开它们,它们就会显示出来。有没有办法将代码添加到我的dismiss操作,该代码将在解除当前视图时刷新.xib视图或沿着这些行的某些内容。因此,一旦视图被驳回,新标题总数就会显示在标签上?任何帮助都是极好的!顺便说一下我是新手,所以在你的回答中请假设我不太了解! 此外,我使用默认值来存储积分值。

- (IBAction)dismiss:(id)sender {

    [self.presentingViewController dismissModalViewControllerAnimated:YES];
}

这是我如何管理积分/硬币。

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        coins = [[[NSUserDefaults standardUserDefaults] valueForKey:@"coins"] unsignedLongLongValue];
    }
    return self;
}

-(void) viewWillAppear:(BOOL)animated{

    labelCoins.text = [NSString stringWithFormat:@"%lld", coins];
}

4 个答案:

答案 0 :(得分:1)

您可以在某处将相应的文本添加到UILabel。它可能目前在viewDidLoad。把这个逻辑放在这样的viewWillAppear:中:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    //example code to update label
    self.creditsLabel.text = numberOfCredits;
}

如果您的UILabel(在该示例中为creditsLabel)不是属性,则需要使用此属性才能使用。


根据您刚刚添加的新代码,这并没有真正解决您的问题。您只需将coins作业添加到viewWillAppear即可。原因是您需要从用户默认值中重新提取硬币值(当您在默认值中更改值时,此值不会自动更新)。

-(void) viewWillAppear:(BOOL)animated{
    coins = [[[NSUserDefaults standardUserDefaults] valueForKey:@"coins"] unsignedLongLongValue];
    labelCoins.text = [NSString stringWithFormat:@"%lld", coins];
}

答案 1 :(得分:0)

UILabel是表格视图中单元格的一部分,还是出现在当前显示的视图中的其他位置?

如果是后者,那么将您的UILabel连接到IBOutlet,然后您可以执行以下操作:

- (IBAction)dismiss:(id)sender {
    [myCreditsLabel setText: [NSString stringWithFormat: @"my credits are worth $%4.2f", creditsAsFloat]];
    [self.presentingViewController dismissModalViewControllerAnimated:YES];
}

(“creditsAsFloat”只有一个浮点数,但在这个上下文中它需要是视图控制器对象的成员。)

答案 2 :(得分:0)

dismissModalViewControllerAnimated已过时且已过时。

现代的方式是将其发送到您的presentingViewController

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion

允许您提供完成块,您可以在其中更新演示视图控制器。

或者你可以为所呈现的视图控制器的委托声明一个协议 - 这将使你对整个过程进行细粒度的控制(我不知道你知道什么 - 如果你需要了解更多我可以扩展答案......)。

答案 3 :(得分:0)

首先,我们可能会给您不准确的建议,因为我们无法清楚地知道UILabel的位置:

  • 在视图中被解雇
  • 在展示视图中

猜猜第二个选项对你提出问题更有意义。

其次,您有两种选择:

  • 丑陋而快速
  • 好又贵又

丑陋而快速

只需在NSDefaults键中添加一个观察者,用于将您的积分金额存储在控制器中,以保留对UILabel的引用。查看Xcode文档中的

Registering for Key-Value Observing

addObserver:forKeyPath:options:context:

做一次并不是那么糟糕但是因为它很容易和快速,你可以很快陷入真正的混乱。

好又贵又

使用委托模式告诉您的演示控制器更新UILabel的内容。

你应该选择第二种选择。你可能听起来有点过分和无聊,但从长远来看它会付出代价。

祝你好运。