1

我目前正在使用下面的代码来关闭故事板表格视图,用户可以在其中进行应用内购买,然后显示 .xib,这是我的应用的主视图,并在 UILabel 中显示总积分。问题是他们刚刚通过购买添加的新积分总额此时未显示在 UILabel 中。一旦我完全关闭应用程序并重新打开它,它们就会出现。有没有办法在我的关闭操作中添加代码,在关闭当前视图时刷新 .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

4 回答 4

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];
}
于 2013-03-07T23:38:15.313 回答
0

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

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

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

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

于 2013-03-07T23:36:12.397 回答
0

dismissModalViewControllerAnimated是旧的和过时的。

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

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

它允许您提供一个完成块,您可以在其中更新您的呈现视图控制器。

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

于 2013-03-07T23:40:48.227 回答
0

首先,我们可能会给你不准确的建议,因为我们无法清楚地告诉 UILabel 在哪里:

  • 认为被驳回
  • 在呈现视图中

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

其次,您有两种选择:

  • 又丑又快
  • 又好又贵

又丑又快

只需在 NSDefaults 键中添加一个观察者,用于将信用额度存储在控制器中,该控制器保留对 UILabel 的引用。在 Xcode 文档中查找

Registering for Key-Value Observing

或者

addObserver:forKeyPath:options:context:

做一次并没有那么糟糕,但由于它既简单又快速,你很快就会陷入真正的混乱。

好又贵

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

你应该选择第二个选项。你可能听起来矫枉过正和无聊,但从长远来看,它会有所回报。

祝你好运。

于 2013-03-07T23:45:37.393 回答