3 回答

TA貢獻1876條經驗 獲得超6個贊
我認為您誤解了有關iOS模式視圖控制器的一些核心概念。當您關閉VC1時,任何由VC1呈現的視圖控制器也將被關閉。Apple希望模式視圖控制器以堆疊的方式流動-在您的情況下,VC2由VC1提供。一旦您從VC1提供VC2,就將VC1解雇,這簡直是一團糟。為了實現所需的功能,在VC1退出后,buttonPressedFromVC1應該立即使mainVC出現在VC2中。我認為,沒有代表就可以實現這一目標。大致情況:
UIViewController presentingVC = [self presentingViewController];
[self dismissViewControllerAnimated:YES completion:
^{
[presentingVC presentViewController:vc2 animated:YES completion:nil];
}];
注意self.presentingViewController存儲在其他變量中,因為在vc1關閉自身之后,您不應對其進行任何引用。

TA貢獻1794條經驗 獲得超8個贊
Swift中的示例,描繪了上述代工廠的說明和Apple的文檔:
基于Apple的文檔和上述鑄造廠的說明(糾正了一些錯誤),使用委托設計模式的presentViewController版本:
ViewController.swift
import UIKit
protocol ViewControllerProtocol {
func dismissViewController1AndPresentViewController2()
}
class ViewController: UIViewController, ViewControllerProtocol {
@IBAction func goToViewController1BtnPressed(sender: UIButton) {
let vc1: ViewController1 = self.storyboard?.instantiateViewControllerWithIdentifier("VC1") as ViewController1
vc1.delegate = self
vc1.modalTransitionStyle = UIModalTransitionStyle.FlipHorizontal
self.presentViewController(vc1, animated: true, completion: nil)
}
func dismissViewController1AndPresentViewController2() {
self.dismissViewControllerAnimated(false, completion: { () -> Void in
let vc2: ViewController2 = self.storyboard?.instantiateViewControllerWithIdentifier("VC2") as ViewController2
self.presentViewController(vc2, animated: true, completion: nil)
})
}
}
ViewController1.swift
import UIKit
class ViewController1: UIViewController {
var delegate: protocol<ViewControllerProtocol>!
@IBAction func goToViewController2(sender: UIButton) {
self.delegate.dismissViewController1AndPresentViewController2()
}
}
ViewController2.swift
import UIKit
class ViewController2: UIViewController {
}
基于上述代工廠的解釋(更正了一些錯誤),使用委托設計模式的pushViewController版本:
ViewController.swift
import UIKit
protocol ViewControllerProtocol {
func popViewController1AndPushViewController2()
}
class ViewController: UIViewController, ViewControllerProtocol {
@IBAction func goToViewController1BtnPressed(sender: UIButton) {
let vc1: ViewController1 = self.storyboard?.instantiateViewControllerWithIdentifier("VC1") as ViewController1
vc1.delegate = self
self.navigationController?.pushViewController(vc1, animated: true)
}
func popViewController1AndPushViewController2() {
self.navigationController?.popViewControllerAnimated(false)
let vc2: ViewController2 = self.storyboard?.instantiateViewControllerWithIdentifier("VC2") as ViewController2
self.navigationController?.pushViewController(vc2, animated: true)
}
}
ViewController1.swift
import UIKit
class ViewController1: UIViewController {
var delegate: protocol<ViewControllerProtocol>!
@IBAction func goToViewController2(sender: UIButton) {
self.delegate.popViewController1AndPushViewController2()
}
}
ViewController2.swift
import UIKit
class ViewController2: UIViewController {
}
- 3 回答
- 0 關注
- 610 瀏覽
添加回答
舉報