2016-12-26 54 views
1

我的目標包括大量視圖,需要基於每個用戶操作呈現不同視圖。這裏我想要做的是獲得更清晰的視圖層次結構和更好的用戶體驗。一旦下一個模態出現,關閉或刪除先前的模態顯示視圖控制器

  1. 根視圖控制器當前第一視圖控制器模態
  2. 當我點擊第一個視圖控制器按鈕,那麼第二個視圖控制器模式地出現在它。
  3. 只要第二視圖控制器確實出現,我想關閉或從視圖層次結構中刪除第一個。

我能做到這一點? 如果是的話,我應該怎麼做?

如果不是,解決這個問題的正確方法是什麼,因爲我將在每個視圖中呈現許多模態呈現的視圖控制器。我認爲,即使我想解散當前的觀點,前一個仍然會在當前的觀點解散時出現。

UPDATE:

VC1(根)> VC 2(這是本模態)> VC 3(這是 本模態超過VC 2)

當我解僱VC3時,VC2仍在查看內存。所以,我不想在出現VC3時立即出現VC2,而是希望通過從視圖層次結構中刪除或解除VC2來查看VC1

enter image description here

WANT:在圖像,當我解僱了藍色,我不希望看到在我看來內存的粉紅色,我想盡快藍色的出現將其刪除。

這就是我想要做的。

任何幫助?謝謝。

+0

因此,如果我沒有弄錯,你想要做什麼是提出如下:vc1-> vc2-> vc3和解僱vc3時,你想在vc1,對不對? –

+0

它的權利....但在這裏我想要做的。根> vc1> vc2> vc3當我解僱vc3那裏應該不是vc1和vc2在內存視圖層次 –

+0

我假設根應該是vc1 ... –

回答

4

所以,讓我們假設你有一個故事板類似:

enter image description here

應該發生的是:

  • 呈現第二視圖控制器(從第一個視圖控制器)。
  • 呈現第三個ViewController(來自第二個ViewController)。
  • 解散到第一個ViewController(從第三個ViewController)。

在第三視圖控制器按鈕的動作:

@IBAction func tapped(_ sender: Any) { 
    presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) 
} 

正如你所看到的,通過訪問當前視圖控制器的presentingViewController,您可以關閉該視圖控制器以前的層次結構:

呈現此視圖控制器的視圖控制器。

通過實施presentingViewController?.presentingViewController?這意味着:在所呈現的呈現當前視圖控制器:)

這似乎有點混亂,但它是非常簡單的。

所以輸出應該是這樣的(我加了背景色設爲viewControllers -as VC1:橙色,VC2:黑色和VC3:光橙,使其清晰顯示):

enter image description here

編輯:

如果你問,除去中間的視圖控制器(S)(在這個例子中的第二視圖控制器),dismiss(animated:completion:)這樣將自動:

如果出現連續幾個視圖控制器,從而構建一個 堆棧呈現視圖控制器,呼籲視圖這種方法 控制器在堆棧中較低駁回其直接子視圖 控制器和孩子在上面的所有視圖控制器堆棧。 發生這種情況時,只有最上面的視圖以動畫 方式被解除;任何中間視圖控制器都會從 堆棧中簡單地刪除。最頂端的視圖使用其模式轉換 樣式被忽略,這可能與堆棧中較低的其他視圖控制器 使用的樣式不同。

指的是什麼,你問:

我想就算我想放棄目前看來,前一個會 仍然出現在當前的解僱。

我認爲,在UI清晰顯示(我覺得很確定),但在dismiss文檔討論中提到,無論是第三和第二將從堆棧中刪除。這是正確的方法。

希望它有幫助。

+1

我認爲它與=> self.view.window?.rootViewController?.dismiss(animated:true,completion:nil)是一樣的。 –

+0

那麼,它是否給出了預期的結果?你想要達到什麼目標? –

+0

我很遺憾地說這不是。我完全想從視圖內存中刪除vc2,當vc3出現時,它將是vc1> vc3。 –

1

這是我在不同的角度看來,

  1. 根視圖控制器目前的第二個視圖控制器
  2. 添加的firstView到第二個視圖
  3. 辭退的firstView按鈕按壓時的控制器d。

enter image description here

第二個視圖控制器,

class ViewController: UIViewController, FirstViewControllerProtocol { 

    weak var firstViewController: FirstViewController? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     print("Not initiated: \(firstViewController)") 

     firstViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController 
     addChildViewController(firstVC!) 
     firstViewController?.delegate = self 
     view.addSubview((firstViewController?.view)!) 

     print("Initiated: \(firstViewController)") 
    } 

    func dismiss() { 
     firstViewController?.view.removeFromSuperview() 
     firstViewController?.removeFromParentViewController() 

    } 
} 

FirstViewController,

protocol FirstViewControllerProtocol { 
    // Use protocol/delegate to communicate within two view controllers 
    func dismiss() 
} 

class FirstViewController: UIViewController { 

    var delegate: FirstViewControllerProtocol? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func dismiss(_ sender: Any) { 
     delegate?.dismiss() 
    } 

    deinit { 
     print("BYE") 
    } 

} 
+0

我會試一試。謝謝。 –

+0

另外,我添加了一些日誌消息。當關閉FirstViewController時,deinit將被調用並釋放內存。 – WeiJay

+0

我真的不明白這是什麼意思......我認爲@IBAction func駁回應包括第二個vc?如果你不介意,你可以用3 vc發表答案嗎? vc1(root)> vc2> vc3。謝謝 –

相關問題