2012-08-06 3 views
0

그래서 여기에 문제가 있습니다. 나는 iOS 프로그래밍에 비교적 익숙하며 거대한 프로젝트를 진행했다.UIViewController 하위 클래스 서브 클래 싱로드 문제

기본적으로 동일한 패턴을 따르지만 여러 가지 스프라이트 이미지와 값을 가진 여러 레벨의 게임에서 작업하고 있으며 속도면에서 IB의 모든 레벨을 배치하기로 결정했습니다. 나도 알아,하지만 나와 함께 일해.) 각각의 "레벨"은 "FireLevel1ViewController", "FireLevel2ViewController"등의 라인을 따라 자체 뷰 컨트롤러를 가지고 있습니다. 이러한 뷰 컨트롤러는 모두 "GameController"라는 UIViewController의 사용자 정의 하위 클래스에서 상속합니다.

내 테스트 장치에서 각 레벨을 열면 GameController의 viewDidLoad가 내 하위 컨트롤러의 init 또는 viewDidLoad 메서드보다 먼저 호출되기 때문에 내 수준 이미지/값 중 아무 것도 수퍼 클래스 속성에 할당되지 않습니다. . 특히 레벨의 시작 부분에 숨겨져 있어야하는 일시 중지 메뉴가 있지만 (GameController의 viewDidLoad에서 setHidden을 수행하고 있습니다), FireLevel1이 PauseMenu와 올바른 IB 속성을 연결하기 전에 GameController의 viewDidLoad가 실행되기 때문에 GameController가 그냥 숨 깁니다 빈보기 및 실제 PauseMenu는 결코 숨겨지지 않습니다.

여기에 여러 가지 문제가있을 수 있지만 대부분은 올바르게 UIViewController의 하위 클래스를 서브 클래 싱하는 법과 첫 번째 하위 클래스의 메서드에서 작동하는 두 번째 하위 클래스의 속성/값/이미지를 얻는 방법을 제대로 이해하지 못한다고 생각합니다. .

도움을 주셔서 감사합니다. FireLevel1Controller에 대한

@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; 
} 

코드 :

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

} 
+0

GameController 초기화시에 이상한 점이 없으면 GameController의'viewDidLoad :'는 서브 클래스 초기화 전에 호출되어서는 안됩니다. –

+0

에 오신 것을 환영합니다. 문제를 디버그하는 데 도움이되도록 자세한 정보가 필요합니다. '- [GameController viewDidLoad]'에 중단 점을 넣으십시오. 앱을 실행하고 중단 점에 도달하면 스택 추적을 복사합니다. 게시물을 수정하고 스택 추적에 붙여 넣습니다. –

+0

FireController의 viewDidLoad와 GameController의 viewDidLoad 둘 다에 중단 점을 추가 한 후에 올바른 순서로 호출하는 것이므로 문제는 FireController의 init을 호출하지 않는다는 것입니다. (여러 개의 중단 점을 추가했으며, 그들), 그래서 나는 아마 내가 뭔가 잘못하고 있다고 생각합니다. – Elizabeth

답변

0

당신이 viewWillAppear를 사용하여 시도해 봤어 나는 GameController에 대한 이해했다 그 질문에 ...

코드를 희망? 이 메서드는 표시되는 모든 UI 요소가 초기화 된 후에 호출해야합니다.

0

아아아 나는 그것을 알아 냈습니다. 실수로 변수를 부정했습니다. 나는 mainview = theMainview하고 있었음에 틀림 없다. 대신 theMainview = mainview - 나는 그들 모두를 0으로 지정했다. 나는 init에서 viewDidLoad로 그것들을 모두 옮겼고, [super viewDidLoad]를 그 아래로 옮겼습니다. 이제는 완벽하게 작동합니다!

관련 문제