0

では、本題です。私は iOS プログラミングに比較的慣れていませんが、巨大なプロジェクトを引き受けました。

基本的に同じパターンに従いますが、スプライトの画像と値が異なる複数のレベルを持つゲームに取り組んでおり、速度のために IB ですべてのレベルをレイアウトすることにしました (必ずしもベスト プラクティスではありませんが、私と一緒に働いてください)。各「レベル」には、「FireLevel1ViewController」、「FireLevel2ViewController」などの独自のビュー コントローラーがあります。これらのビュー コントローラーはすべて、私が作成した「GameController」と呼ばれる UIViewController のカスタム サブクラスから継承します。

私の問題は、テスト デバイスで各レベルを開くと、GameController の viewDidLoad がサブクラス コントローラーの init メソッドまたは viewDidLoad メソッドの前に呼び出されるため、レベルの画像/値がスーパークラス プロパティに割り当てられないことです。具体的には、レベルの最初に非表示にする必要がある一時停止メニューがあります (GameController の viewDidLoad で setHidden を実行しています) が、FireLevel1 が正しい IB プロパティを PauseMenu に関連付ける前に GameController の viewDidLoad が実行されるため、GameController は単に非表示になります。空のビューであり、実際の PauseMenu が非表示になることはありません。

ここで複数の問題が発生している可能性がありますが、ほとんどの場合、UIViewController のサブクラスをサブクラス化する方法と、2 番目のサブクラスのプロパティ/値/画像を最初のサブクラスのメソッドで動作させる方法を正しく理解していないと思います。

助けてくれてありがとう!その質問が理にかなっているといいのですが...

ゲームコントローラのコード:

@implementation GameController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.view addSubview:pauseMenu];
    [pauseMenu addSubview:helpMenu];

    //Hides the pause and help menus until their respective buttons are pressed
    [pauseMenu setHidden:YES];
    [helpMenu setHidden:YES];
    isPaused = NO;
}

FireLevel1Controller のコード:

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

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if(self)
    {
           theMainview = mainview;
           theScene = scene;
           theBG = bg;
           theHudView = hud;
           thePauseView = pauseMenu;
           theHelpView = helpMenu;
    }

return self;
}


-(void)viewDidLoad
{

    [super viewDidLoad];
    firstTurret = [[StationaryEnemy alloc]init:turretImage1 baseView:base1];
    secondTurret = [[StationaryEnemy alloc]init:turretImage2 baseView:base2];

    NSLog(@"I'm in view did load");

}
4

2 に答える 2

0

使ってみましたviewWillAppearか?このメソッドは、表示されているすべてのUI要素が初期化された後に呼び出す必要があります。

于 2012-08-06T22:59:12.020 に答える
0

ああ、私はそれを理解しました-私は誤って自分の変数を否定していました. mainview = theMainview; を実行する必要がありました。theMainview = mainview の代わりに - 私はそれらをすべてゼロに割り当てていました。また、それらをすべて init から viewDidLoad に移動し、[super viewDidLoad] をその下に移動したところ、完全に機能するようになりました。

于 2012-08-07T20:24:20.720 に答える