4

私は現在、最初の iPhone ゲームの構造を設計していて、問題に遭遇しました。現在、再生するレベルを選択できる「MenuViewController」と、レベルが再生される「LevelViewController」があります。

「MenuViewController」のAUIButtonは、「LevelViewController」へのモーダル セグエをトリガーします。

「LevelViewController」のAUIButtonは、次のメソッドをトリガーして「MenuViewController」に戻ります。

-(IBAction)back:(id)sender //complete
{
    [self dismissModalViewControllerAnimated:YES];
}

問題は、UILabelプレイヤーが持っている合計ポイント数を印刷するメニュー ページがあることです。レベルからメニューに戻るたびに、このラベルが自動的に更新されるようにします。現在、ラベルは「MenuViewController」でプログラムによって定義されています。

-(void)viewDidLoad {
    [super viewDidLoad];
    CGRect pointsFrame = CGRectMake(100,45,120,20);
    UILabel *pointsLabel = [[UILabel alloc] initWithFrame:pointsFrame];
    [pointsLabel setText:[NSString stringWithFormat:@"Points: %i", self.playerPoints]];
    [self.pointsLabel setTag:-100]; //pointsLabel tag is -100 for id purposes
}

self.playerPoints は MenuViewController の整数プロパティです

ラベルを更新する方法はありますか? お早めにどうぞ!

4

3 に答える 3

9

これは委任に最適なケースです。LevelViewController が完了したら、MenuViewController で処理されるデリゲート メソッドを起動する必要があります。このデリゲート メソッドは、モーダル VC を閉じてから、他に必要なことを実行する必要があります。提示する VC は通常、提示するモーダル ビューの却下を処理する必要があります。

これを実装する方法の基本的な例を次に示します。

LevelViewController.h (Interface 宣言の上):

@protocol LevelViewControllerDelegate
    -(void)finishedDoingMyThing:(NSString *)labelString;
@end

ivar セクション内の同じファイル:

__unsafe_unretained id <LevelViewControllerDelegate> _delegate;

ivar セクションの下の同じファイル:

@property (nonatomic, assign) id <LevelViewControllerDelegate> delegate;

LevelViewController.m ファイル内:

@synthesize delegate = _delegate;

MenuViewController.h で、#import "LevelViewController.h"自分自身を LevelViewControllerDelegate のデリゲートとして宣言します。

@interface MenuViewController : UIViewController <LevelViewControllerDelegate>

MenuViewController.m 内でデリゲート メソッドを実装します。

-(void)finishedDoingMyThing:(NSString *)labelString {
    [self dismissModalViewControllerAnimated:YES];
    self.pointsLabel.text = labelString;
}

そして、モーダル VC を提示する前に、自分自身を LevelViewController のデリゲートとして設定してください。

lvc.delegate = self;  // Or whatever you have called your instance of LevelViewController

最後に、LevelViewController 内で必要な作業が完了したら、次のように呼び出します。

[_delegate finishedDoingMyThing:@"MyStringToPassBack"];

これが意味をなさない場合は、叫び声と私があなたの理解を助けることができます.

于 2012-08-15T21:06:55.300 に答える
0

self.pointsLabelUILabel を指すプロパティを作成[self.pointsLabel setText:[NSString stringWithFormat:@"Points: %i", self.playerPoints]];すると、新しいスコアでラベルを更新するようなものを呼び出すことができます

于 2012-08-15T20:45:28.053 に答える