子类化UIViewController的子类加载问题

时间:2012-08-06 22:23:51

标签: objective-c ios uiviewcontroller subclassing

所以,这就是问题所在。我对iOS编程比较陌生,而且我已经开始了一个巨大的项目。

我正在开发一个多层次的游戏,基本上遵循相同的模式,但有不同的精灵图像和值,我只是为了速度而决定在IB中列出所有级别(不一定是最佳实践,我知道,但与我合作)。每个“级别”都有自己的视图控制器,沿着“FireLevel1ViewController”,“FireLevel2ViewController”等等。所有这些视图控制器都继承自我创建的名为“GameController”的UIViewController的自定义子类。

我的问题是,当我在我的测试设备上打开每个级别时,GameController的viewDidLoad在我的子类控制器的init或viewDidLoad方法之前被调用,因此我的级别图像/值都没有被分配给超类属性。具体来说,我有一个应该在关卡开始时隐藏的暂停菜单(我在GameController的viewDidLoad中执行setHidden),但由于GameController的viewDidLoad在FireLevel1有机会将正确的IB属性与PauseMenu相关联之前运行,因此GameController只是隐藏一个空视图,实际的PauseMenu永远不会被隐藏。

我可能会遇到多个问题,但大多数情况下我认为我并没有真正理解如何子类化UIViewController的子类以及如何使第二个子类的属性/值/图像在第一个子类的方法中工作。

非常感谢您的帮助!我希望这个问题有道理......

GameController的代码:

@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");

}

2 个答案:

答案 0 :(得分:0)

您尝试使用viewWillAppear了吗?应该在所有可见的UI元素初始化之后调用该方法。

答案 1 :(得分:0)

啊,我明白了 - 我不小心否定了我的变数。我应该一直在做mainview = theMainview;而不是theMainview = mainview - 我只是将它们全部归零。我还将它们从init中移出到viewDidLoad中,并在它们下面移动了[super viewDidLoad],现在它完美无缺!