0

在两天的时间里问了三个问题我感觉很糟糕,但是我被困在了论坛上,我找不到答案,所以我希望有人能帮助我——我想这都是学习乐趣的一部分!

在我的程序中,我有三个视图,它们的顺序是 GridScreen -> GameScreen -> CorrectScreen。在 CorrectScreen 上,我有一个返回到 GridScreen 的按钮。

在 GridScreen 上,我有一堆按钮,用户可以按这些按钮进入 GameScreen。当用户正确回答问题时,他会从 GameScreen 转到 CorrectScreen 进行确认,然后返回到 GridScreen。

在上一个问题中,我询问如何跟踪在 GridScreen 上按下的按钮,以便当我从 CorrectScreen 回到它时,我可以用勾号替换图标。之前已经解决了,但是这样做我又产生了另一个问题。

在 CorrectScreen 中,当用户按下按钮返回时,会调用以下两个函数:

[self.gridScreen updateUserIcon:buttonThatWasPressed];
[self.gridScreen updatePoints:accumulatedpoints];

其中 updateUserIcon 是:

-(void)updateUserIcon:(UIButton *)button
{
UIButton *buttonPressed = button; 
self.button1 = buttonPressed;
[self.button1 setImage:[UIImage imageNamed:@"tick.png"] forState:UIControlStateNormal];
}

updatePoints 是:

-(void)updatePoints:(int)points
{
    self.currentPoints.text = [[NSString alloc]initWithFormat:@"Current points: %d", points];
}

其中 button1 是 UIButton 而 currentPoints 是 UILabel。

现在,当我在调用这两个函数后使用以下代码返回 GridScreen 时,勾选出现在我想要的按钮上,但标签没有正确更新:第一种情况:

[[[self presentingViewController]presentingViewController] dismissModalViewControllerAnimated:YES];

而如果我使用这种下一种方式,勾号根本不会出现,但标签会完美更新:第二种情况:

GridScreen *screen = [[GridScreen alloc] initWithNibName:nil bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:screen animated:YES];

(我通常使用第二种情况加载视图)。

在第一种情况下,即使我执行了以下代码:

-(void)updatePoints:(int)points
{
    self.currentPoints.text = @"A";
    NSLog(@"Current Points %@", self.currentPoints.text);
}

我的 NSLog 返回当前点 (null)。

解决方案与我返回 GridScreen 的第一种方法有关勾号。

如果有人可以提供帮助,我很想知道 - 我对使用 Objective-C 进行编程相当陌生,所以如果其中任何一个是“糟糕的代码”,我很高兴被告知哪里出了问题,所以我不会犯类似的错误。

再次感谢大家,这个网站非常适合提供帮助,我提前感谢您的建议。

安迪。

4

1 回答 1

0

好的,愚蠢的问题,但你为什么不只是使用通知来向屏幕发送消息?

这是最简单和最安全的方法。

在 GridScreen 添加此通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toggleLabel:) name:@"CorrectAnswerNotification" object:nil];

在推新屏幕之前。

现在在 CorrectScreen 中,在弹出视图之前触发该通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"CorrectAnswerNotification" object:self userInfo:nil];

在 userInfo 字典中传递你想要的任何信息(这可以是一个字典,所以你可以传递你需要的任何信息)

并在 GridScreen 中管理 toggleLabel 方法中的所有内容:

-(void)toggleLabel:(NSNotification *)notification {

    //read the documentation dictionary
    NSDictionary *infoDictionary = [notification userInfo];
    //remove the notification first

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"CorrectAnswerNotification" object:nil];

    //now change the buttons...
    [self updateUserIcon:buttonThatWasPressed];
    [self updatePoints:accumulatedpoints];

}

因为我被问到通知中心,所以这里有一些直接来自Apple 文档的详细信息:

NSNotificationCenter 对象(或简称为通知中心)提供了一种在程序中广播信息的机制。NSNotificationCenter 对象本质上是一个通知调度表。

对象注册到通知中心以使用 addObserver:selector:name:object: 或 addObserverForName:object:queue:usingBlock: 方法接收通知(NSNotification 对象)。此方法的每次调用都指定一组通知。因此,对象可以通过多次调用这些方法注册为不同通知集的观察者。

当一个对象(称为通知发送者)发布通知时,它会向通知中心发送一个 NSNotification 对象。然后,通知中心通过向他们发送指定的通知消息,将通知作为唯一参数传递来通知通知满足注册时指定标准的任何观察者。

通知中心维护一个通知调度表,该表为特定观察者指定一个通知集。通知集是发布到通知中心的通知的子集。每个表条目包含三个项目:

Notification observer: Required. The object to be notified when qualifying notifications are posted to the notification center.

Notification name: Optional. Specifying a name reduces the set of notifications the entry specifies to those that have this name.

Notification sender: Optional. Specifying a sender reduces the set of notifications the entry specifies to those sent by this object.
于 2012-06-03T23:53:25.767 回答