2014-09-12 60 views
4

我試圖設置一個登錄屏幕(ViewController),該屏幕在成功登錄後導致本身是導航的一部分的用戶列表(UserTableViewController)控制器。在隨後的屏幕上,如UserTableViewController應該可以註銷。這會使用戶回到初始登錄屏幕ViewController。我真的很難以正確的方式連接這些屏幕。必須說,我沒有很多與不同類型的塞格斯和/或代表這樣的經驗,具有一定的研究完成後,我去了一些試驗:基本:正確連接多個(視圖)控制器

  1. ViewController成功登錄觸發modal-segue到導航控制器(本身導致UserTableViewController
  2. UserTableViewController有一個註銷按鈕,可以觸發另一個模式繼續回到ViewController。我採取了這些模態賽段,因爲首先,我不希望有一個導致自動創建的後退按鈕或類似的層次結構,其次,我不想在這兩個屏幕之間產生任何「麻煩」,其中一個導航控制器,而另一個沒有。

......看起來這不是一種方法。一個循環之後有些事情會混淆,而屏幕正在改變錯誤的方式。我想一個莫代爾 - 塞格羅圈是不可能的,因爲至少必須有父母和孩子。下一步試驗:

  1. ViewController成功登錄後,觸發模式-SEGUE /推SEGUE導航控制器(本身導致UserTableViewController
  2. 要返回到登錄界面我來實現,而不是代表在點擊「註銷」時觸發的另一個細分 - 在這裏,我面臨的問題是,我無法正確設置UserTableViewController的代表preparingForSegueViewController。此時segue.destinationViewController無法降頻爲UserTableViewController,但僅限於NavigationController什麼不允許我在目的地設置代表(UserTableViewController)。

第三審判是做同樣像第二種方法,但實現從ViewController 直接UserTableViewController一個SEGUE。這可能工作,但現在我沒有任何導航欄了,在我的UserTableViewController ...!

當然,我可以在第三種解決方案中進行手動修復,例如插入獨立導航欄,但這兩種方式似乎都不是很有效。因此,我非常感謝一些提示,強調我在一方面被誤解(完全),並在另一方面展示了一種很好的方式。非常感謝您的幫助!

編輯: 我可以嘗試設置導航控制器作爲初始視圖控制器,然後才讓登錄屏幕ViewController呈現/由UserTableViewController駁回 - 是一條可行之路還是有廣爲人知的最佳實踐爲那些登錄查看場景?

只是一種視覺幫助: enter image description here

回答

0

This post出現就是爲了解決你所面臨的問題,如果我理解正確。

而且,沒有意思雞蛋裏挑骨頭,但它的「模式」,而不是「模塊化」 :)

+0

感謝您的意見,我一直在努力!無論如何,我很好奇,如果有一種常用的方式來處理登錄屏幕,從實際角度來看,初始視圖控制器,但不是導航堆棧的一部分。當一個註銷它返回 - 我想知道這個週期內的什麼樣的關係是最好的...此外,我想知道如何在這種情況下實現一個委託,導航控制器「阻止向下轉換」 。 @Nicky – 2014-09-12 21:23:40

+0

我相信這個導航實際上不應該是這兩個控制器中的任何一個的責任,而是一些負責應用程序流的協調器對象。如果你有一個場景需要你將用戶登錄到導航控制器的層次結構中?例如,他們的令牌過期了,您需要他們再次登錄。 – Nicky 2014-09-12 21:35:28

+0

無論如何,首選的方法是讓呈現控制器知道(通過委託或其他方式)呈現的控制器已完成其工作,因此它可以處理解僱。畢竟,進一步在導航中的控制器不應該真正意識到它在屏幕上的顯示。 – Nicky 2014-09-12 21:39:18

0

我認爲這可能是做這件事的一種可接受的方式:

  1. 登錄視圖(ViewController)是初始視圖控制器
  2. 在登錄成功的情況下:從登錄視圖導航控制器,處理模態-SEGUE後續視圖
  3. 通過實施子類UIStoryboardSegue的啓用在夫特駁回-塞格斯(需要這樣寫:@objc(DismissSegue) class DismissSegue: UIStoryboardSegue { ),其覆蓋其執行()來(sourceViewController.presentingViewController!!).dismissViewControllerAnimated(true, completion: nil)
  4. 從隨後的視圖(在我的情況UserTableViewController辭退-SEGUE)返回到登錄視圖
  5. 實現內prepareForSegue每個的註銷動作查看控制器允許用戶註銷

不過,如果有人知道更好的做法,我很高興聽到!

1

請考慮使用「unwind」segue。在ViewController創建一個函數,如下所示:從退出按鈕的UserTableViewController退出符號,其是在頂部的第三個按鈕

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) { 
    yourLogoutCode() 
} 

UserTableViewController控制拖動,並選擇在選擇unwindToThisViewController(或任何名稱ViewController)。

現在,當您單擊註銷按鈕時,您將返回到ViewController並執行unwindToThisViewController,您可以在其中放置註銷代碼。

下面是一個例子:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func yourLogoutCode() { 
     println("Logging Out ...") 
    } 

    @IBAction func unwindToThisViewController(segue: UIStoryboardSegue) { 
     self.yourLogoutCode() 
    } 


} 

而且UserTableViewController:

import UIKit 
var selectedRow = -1 
class UserTableViewController: UITableViewController { 
    var firstArray = ["Item1","Item2","Item3","Item4"] 
    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

    } 

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return firstArray.count 
    } 


    let nameOfCell = "Cell" 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier(nameOfCell, forIndexPath: indexPath) as UITableViewCell 
     cell.textLabel!.text = firstArray[indexPath.row] 
     return cell 
    } 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     selectedRow = indexPath.row 

    } 


} 

注意,從退出按鈕開卷整個連接埋在故事板內。您可以通過查看Connections Inspector來確認是否發生了這一切。