2014-04-20 114 views
0

原因請看我有以下代碼:找不到標識符

在1類(GamePlay1)我有方法,該方法改變視圖控制器如果遊戲結束:

-(void)end 
{ 
    [self performSegueWithIdentifier:@"menu1" sender:self]; 
} 

在2 SKView類我有一個方法在1類調用函數來更改視圖控制器:

-(void)gameEnded 
{ 
    GamePlay1 *gp1 = [[GamePlay1 alloc]init]; 
    [gp1 end]; 
} 

我得到警告:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<GamePlay1: 0x156329e0>) has no segue with identifier 'menu1'' 

我試圖改變seque名稱幾次,我也試圖清理我的項目,刪除應用程序和再次安裝,但結果是一樣的。

+0

來自錯誤的segue標識符在一種情況下被命名爲「menu1」,在您的代碼中被命名爲「menu」。 – Larme

+0

寫錯問題。 – MOzeb

回答

0

segue在故事板中定義,當使用alloc和init手動實例化類時,控制器沒有對IB對象的引用,因此沒有定義segue。你想用故事板本身來實例化控制器:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
GamePlay1 *controller = [storyboard instantiateViewControllerWithIdentifier:@"GamePlay1"]; 
[controller end]; 

請注意,這是不是做賽格瑞的正確方式,你需要獲得當前的實例化視圖 - 控制的參考,而不是創建一個新的。

+0

好吧,我明白了第一部分!但是,你能解釋一下正確完成賽格嗎? TNX! – MOzeb

+0

據我所知,當你執行'end' segue時,你當前可見的視圖控制器是一個'GamePlay1'控制器。如果是這種情況,則不需要實例化這種新控制器,但可以在當前實例上調用performSegue。例如,您可以使用委託:您的視圖將在其委託(GamePlay1實例)上調用一個將執行segue的方法。請記住,視圖不應該保存數據,因此不應該實例化新的視圖控制器。他們需要是「愚蠢的」,並與委派,科沃或通知控制器交流 – andreamazz

+0

看起來我在評論中用完了空間。我的建議是花時間學習可可的基本模式。一個很好的資源是你可以在[iTunes U]上免費找到的斯坦福大學課程(https://itunes.apple.com/us/course/developing-ios-7-apps-for/id733644550) – andreamazz