2013-04-24 21 views
0

我正在使用下面的代碼返回到我的登錄視圖。該視圖加載正確,一切都很好。所有按鈕的工作等使用presentViewController後無法找到現有的segues

JALoginViewController *loginVC = [[JALoginViewController alloc] init]; 

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:loginVC]; 

navigationController.modalPresentationStyle = UIModalPresentationFormSheet; 
[self.navigationController presentModalViewController:navigationController animated:YES]; 

但是,如果用戶嘗試再次登錄時,可將他們帶到下一個場景的SEGUE無法找到。

我使用performSegueWithIdentifier如果用戶的登錄憑據是正確的,就像這樣:

[self performSegueWithIdentifier:@"loginSegue" sender:self]; 

這是我收到的錯誤:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<JALoginViewController: 0x8d614b0>) has no segue with identifier 'loginSegue'' 

我已經做了很多在谷歌搜索的並通過文件解決這個問題,我得到的衣櫃(至少我認爲)是this question。解釋和解決方案聽起來像他們可能是正確和相關的,但我不能把它們付諸實踐。

文件我已經閱讀並嘗試:

initWithRootViewController

popToRootViewController - 當前根視圖控制器是一個標籤欄 - 不登陸的場景,我需要這麼遠我知道我可以不用這個。

popViewControl

pushViewControl - 該工程的效果,我不認爲它雖然是正確的方法。我不希望那裏有導航欄,我不希望我的標籤欄在用戶返回到登錄場景時出現。

我已經嘗試了有限/無效的各種方法。在這個階段,任何幫助將不勝感激。

如果我沒有提供足夠的信息,請讓我知道。

感謝

JA

編輯 - 縮小故事板

圖像[故事板的縮小圖像] [1]

+0

您問您是否可以提供更多信息:故事板的縮小版本(shift-command-4拍攝快照)可能會有所幫助。 – Rob 2013-04-24 13:23:47

+0

根據要求我添加了縮小的圖像。正確的方框突出了我和我想返回的位置。 – Jim 2013-04-24 13:40:24

回答

1

在修訂後的屏幕快照的基礎!從最右邊的紅色突出顯示的場景中,您應該能夠:

[self.tabBarController dismissViewControllerAnimated:YES completion:nil]; 

,你會回到最初的屏幕(我假設你做了從初始屏幕到你的標籤欄控制器的模態延續)。


原來的答覆:

如果你想手動推到一個視圖控制器,而不是通過alloc/init創造它,你應該使用

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"loginsSceneStoryboardIdHere"]; 

,或者,如果該視圖控制器是「初始」場景(從左側進入的簡單箭頭),您可以使用

UIViewController *controller = [self.storyboard instantiateInitialViewController]; 

而且你也不應該手動創建導航控制器。如果loginVC需要一個導航控制器,你應該嵌入的那一幕在右邊的界面生成器導航控制器,然後給出新的導航控制器自己獨特的故事板的標識符,然後你就可以

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"navControllerSceneStoryboardIdHere"]; 

[self presentViewController:controller animated:YES completion:nil]; 

我必須承認,我擔心這整個「通過pushViewController結構返回登錄」。我假設你知道你不是「迴歸」它,而是創建一個新的副本。如果你從A到B然後從B到C然後C到A,你將4個視圖及其控制器保存在內存中,A的兩個副本和B中的一個以及C中的一個(很明顯,不好)。我只是想確保你沒有循環的segues和/或push/presentViewController引用。

如果登錄在你的應用程序,如果你已經做只會把塞格斯(沿途沒有模態塞格斯)的初始場景,你可以做:

[self.navigationController popToRootViewControllerAnimated:YES]; 

這將帶你到頂級視圖控制器,它會彈出並釋放所有介入場景。

如果你使用的是iOS 6,你可以利用unwind segue,它可以實現相同的功能,但它不關心前面的segues是push還是modals。

有很多方法可以剝皮貓,但通常對故事板中的第一個場景做一個新的presentViewController是一個非常糟糕的主意。

+0

羅布,非常感謝您花時間幫助我解決這個問題。你絕對正確的是會保留一些觀點,所以我應該做一些調整。不幸的是我不能在這個場景中使用popToRootViewController,我在其他地方使用這種方法,並且它工作正常,但是這個場景有它自己的導航控制器,嵌入在IB中,popToRootViewController把我帶回這裏。如果我在這裏圍着房子道歉,我對iOS編程真的很陌生。明白了嗎? – Jim 2013-04-24 12:54:48

+0

@ Gr3mlin瞭解。但是,我覺得值得正確地解決這個問題,而不是僅僅希望用戶不會重複這個過程太多次,並且導致你的應用程序由於內存不足而崩潰。雖然iPhone 5擁有1Gb的內存,但4只有512MB,而3GS擁有256MB的內存,所以在使用內存時必須謹慎行事(在模擬器或更新設備上測試時,我們會被誤認爲錯誤的安全感) 。如果僅針對iOS 6和更高版本,則可以使用展開式延遲。如果不是,解決方案的細節將取決於您的故事板。 – Rob 2013-04-24 13:24:08

+0

感謝羅布,不幸的是我支持> = iOS 5,所以使用unwing segue不是我的選擇。 :-( – Jim 2013-04-24 13:41:21

相關問題