2015-06-27 37 views
2

我正在開發一個遊戲,並希望有一個精靈套件場景有自己的視圖控制器(我已經達成了許多辯論後的結論),並且想要避免使用故事板(我可以用故事板完成我想要的,但想要學習如何在沒有故事板的情況下做到這一點)。如何將以編程方式創建的視圖控制器視圖設置爲SKView?

在我的主視圖控制器,點擊一個按鈕後,我有以下的代碼

MyViewController2 *test = [[MyViewController2 alloc] init]; 
test.view = [[SKView alloc] init]; 
[self presentViewController: test animated:YES completion:nil]; 

然而,這只是轉換成灰色屏幕,沒事就可以了(沒有覆蓋「 - (ID)初始化」然而)。下面的代碼會被調用,如果我重寫「 - (ID)初始化」在MyViewController2方法:

-(id)init 
{ 
    NSLog(@"init overwrite works"); 
    SKView * skView = (SKView *)self.view; 
    SKScene2 *scene = [SKScene2 sceneWithSize:skView.bounds.size]; 
    scene.scaleMode = SKSceneScaleModeFill; 
    [skView presentScene:scene]; 
    return self; 
} 

,但它不會顯示,因爲我得到這個錯誤:

-[UIView presentScene:]: unrecognized selector sent to instance 

我知道這是什麼錯誤的意思是(當前的場景只能由skView執行,並且不能由UIView執行),但即使當我創建ViewController並且在它的init中我將視圖設置爲只有SKView,我仍然會得到這個錯誤。我怎樣才能解決這個問題?感謝您的時間和幫助。

回答

1

view屬性由UIViewController管理並代表根視圖。任何時候你都不能簡單地指定自己的觀點。

選項1

如果你想替換爲自己的視圖的視圖屬性,你可以覆蓋UIViewControllerloadView方法和分配的觀點存在。據記載在該方法的類參考:

The view controller calls this method when its view property is requested but is currently nil. This method loads or creates a view and assigns it to the view property

...

You can override this method in order to create your views manually. If you choose to do so, assign the root view of your view hierarchy to the view property

因此,這將是這個樣子:

- (void)loadView 
{ 
    self.view = [[SKView alloc] init]; 
} 

選項2

您可以添加SKView作爲一個子視圖。

一個屬性添加到您的視圖控制器,以便在必要時可以訪問它:

@property (strong, nonatomic) SKView *skView; 

初始化並將其添加爲視圖時加載的子視圖:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.skView = [[SKView alloc] init]; 
    [self.view addSubview:self.skView]; 

    SKScene2 *scene = [SKScene2 sceneWithSize:self.skView.bounds.size]; 
    scene.scaleMode = SKSceneScaleModeFill; 
    [self.skView presentScene:scene]; 
} 
相關問題