2014-10-30 69 views
0

我正在開發一個基於用戶名密碼的系統的應用程序。我的初始視圖控制器被命名爲LoginPageViewController。如果用戶成功登錄,則加載名爲MyNavigationController的導航控制器。除LoginPageViewController之外的所有視圖控制器都可以通過我在此處找到的側邊菜單訪問:Side Menu LibraryMyNavigationController的幫助下。如何在Swift中加載初始視圖控制器?

我的側邊菜單的視圖設置在MyMenuTableViewController中描述,如果選擇了任何表項,則從MyMenuTableViewController加載相關視圖控制器。問題是,我還在我的側面菜單(或菜單表,無論您稱之爲什麼)中添加了「註銷」項目,並且如果選擇此項目,它會向服務器請求註銷HTTP POST,並應加載LoginPageViewController這是我的初始視圖控制器(它不嵌入MyNavigationControlelr)。

問題是,雖然註銷請求處理成功,但我在加載初始視圖控制器(LoginPageViewController)時遇到了問題。

當我嘗試這個時候選擇退出:

self.presentViewController(destViewController, animated: true, completion: nil) 

LoginPageViewController是正裝,但我得到的消息,如:2014-10-30 16:59:26.038 iOpsGenie[2973:66509] Presenting view controllers on detached view controllers is discouraged <iOpsGenie.MyMenuTableViewController: 0x7f85e8fc3f10>. ,如果我點擊登錄頁面的任何地方,我的視野中消失,只有白色屏幕被留下。

然後我試圖在實施方法

func resetAppToFirstController() { 
    self.window?.rootViewController = LoginPageViewController(nibName: nil, bundle: nil) 
    } 

AppDelegate.swift並調用它時,被選擇的項註銷:

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
appDelegate.resetAppToFirstController() 

然後我在viewDidLoad中的第二行的錯誤LoginPageViewController的功能如:

fatal error: unexpectedly found nil while unwrapping an Optional value 

我知道這成了一個很長的問題。我可能被視爲Swift和iOS編程的新手,我試圖說明問題以防止無關緊要的響應。我真的很想知道我錯過了什麼。

self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier(PageNames.LOGIN_PAGE) as LoginPageViewController 

和燒成點擊註銷時,下面的代碼:

問候

+0

當實例在resetApp的LoginPageVC(),你應該傳遞廈門國際銀行的名字,而不是零的第一個參數。 Swift沒有像Objective-C那樣找到與VC相同名稱的筆尖。 – JMFR 2014-10-30 16:00:07

回答

3

我改變resetAppToFirstController的方法來解決這個問題

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
appDelegate.resetAppToFirstController() 

但是,我不知道爲什麼這是有效的。任何一點小小的解釋都會很棒。

1

在迅速我們可以改變根視圖控制器和在該情況下,所有其它 視圖控制器將解除分配,他們將不再是在層次 。

要加載初始視圖控制器或更改根視圖控制器或作出迅速

let storyboard = UIStoryboard(name: "StartingPage", bundle: NSBundle.mainBundle())  
let loginView: SignInVC = storyboard.instantiateViewControllerWithIdentifier("SignInVC") as! SignInVC 
UIApplication.sharedApplication().keyWindow?.rootViewController = loginView 
+0

謝謝你正在尋找這個。 – 2017-02-14 15:22:40

0

註銷操作請允許我提出一個更好的方式做你想要什麼,好嗎? 我在發佈的另一個問題中遇到了類似的問題;請看this question的接受答案。

注意答案上的故事板。它具有視圖控制器的層次結構,允許從登錄控制器啓動,瀏覽多個控制器並從菜單執行註銷。

爲了執行此操作,請按照下列步驟操作。

  1. 使您的初始視圖控制器成爲一個導航控制器,其根視圖爲您的登錄控制器。

  2. 使您的登錄控制器推入Segue的菜單控制器。

  3. 從菜單視圖的「註銷」按鈕執行「退出繼續」到登錄視圖。

展開segue將從導航堆棧中刪除所有視圖,直到它到達您指定的視圖。

放鬆segues真的很容易使用,可以解決很多問題!

添加你登錄的視圖控制器上的以下方法定義:

@IBAction func unwindToLoginScreen(segue:UIStoryboardSegue) { 
} 

然後,在故事板編輯器,可從中選擇您希望能夠放鬆任何視圖控制器。在視圖控制器的頂部有三個圖標。

enter image description here

第一代表視圖控制器;第二個是第一響應者;第三個是出口門。

執行「控制+拖動」從第一個圖標到第三個圖標;將會出現一個下拉菜單,引用您在代碼中所做的所有「unwind segue」聲明。我們的unwindToLoginScreen segue應該出現在這裏。選擇它。

enter image description here

在在故事板編輯器左邊欄中的文檔大綱將在視圖控制器的層次結構出現的開卷Segue公司。選擇它並將其標識符更改爲「登錄」之類的內容。

現在,如果您想要返回到登錄屏幕,您可以調用performSegueWithIdentifier(「Login」)。

使用unwind segues的好處在於,您確實知道堆棧中的所有視圖都將被釋放,您可以在源視圖控制器的prepareForSegue方法中調用準備代碼,目標視圖控制器中的某些代碼就在結束賽格之前;並且不同的視圖控制器之間的連接在故事板編輯器上可見(雖然不像常規賽段那樣明顯)。

0

斯威夫特4

語法在swift4改變:如果你想去 「FirstViewController」 在故事板 「主」 試試下面的代碼

令故事情節= UIStoryboard(名稱: 「主」 ,bundle:Bundle.main)

let firstviewcontroller = storyboard.instantiateViewController(withIdentifier:「FirstViewController」)as! FirstViewController

UIApplication.shared.keyWindow?.rootViewController = firstviewcontroller

相關問題