0

2 日間で 3 つの質問をするのは気分が悪いですが、行き詰まってフォーラムを検索しても答えが見つからなかったので、誰かが私を助けてくれることを願っています。

私のプログラムには、GridScreen -> GameScreen -> CorrectScreen の順序で 3 つのビューがあります。CorrectScreen には、GridScreen に戻るボタンがあります。

GridScreen には、ユーザーが押すと GameScreen に移動できるボタンがたくさんあります。ユーザーが質問に正しく答えると、確認のために GameScreen から CorrectScreen に移動し、GridScreen に戻ります。

以前の質問で、GridScreen で押されたボタンを追跡する方法を尋ねたので、CorrectScreen から戻ったときにアイコンを目盛りに置き換えることができます。それは以前に解決されましたが、そうすることで別の問題が発生しました。

CorrectScreen では、ユーザーがボタンを押して戻ると、次の 2 つの関数が呼び出されます。

[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 です。

ここで、2 つの関数を呼び出した後、次のコードを使用して GridScreen に戻ると、必要なボタンに目盛りが表示されますが、ラベルが正しく更新されません: 最初のケース:

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

これを次の方法で使用すると、目盛りはまったく表示されませんが、ラベルは完全に更新されます。

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

(私は通常、2 番目のケースを使用してビューを読み込みます)。

最初のケースでは、次のコードを実行したとしても:

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

私の NSLog は現在のポイント (null) を返します。

解決策は、GridScreen に戻る最初の方法と関係があります。実際にはビューを再度ロードしませんが、2 番目の方法ではロードしますが、スコアを正しく更新するために何をする必要があるのか​​ 理解できません。ダニ。

誰かが助けてくれるなら、私は知りたいです-私は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 Documentationから直接いくつかの詳細を以下に示します。

NSNotificationCenter オブジェクト (または単に通知センター) は、プログラム内で情報をブロードキャストするメカニズムを提供します。NSNotificationCenter オブジェクトは、基本的に通知ディスパッチ テーブルです。

オブジェクトは通知センターに登録して、addObserver:selector:name:object: または addObserverForName:object:queue:usingBlock: メソッドを使用して通知 (NSNotification オブジェクト) を受け取ります。このメソッドを呼び出すたびに、一連の通知が指定されます。したがって、オブジェクトは、これらのメソッドを数回呼び出すことによって、異なる通知セットのオブザーバーとして登録できます。

オブジェクト (通知送信者と呼ばれる) が通知を投稿すると、NSNotification オブジェクトが通知センターに送信されます。次に、通知センターは、通知が登録時に指定された基準を満たしているオブザーバーに、指定された通知メッセージを送信し、通知を唯一の引数として渡します。

通知センターは、特定のオブザーバーの通知セットを指定する通知ディスパッチ テーブルを維持します。通知セットは、通知センターに投稿された通知のサブセットです。テーブルの各エントリには、次の 3 つの項目が含まれます。

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 に答える