[英]Dismiss modal, then immediately push view controller
如何解開模態然后立即推送另一個視圖?
我在didSelectRowAtIndexPath中添加以下代碼:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ChatTableViewController *chatVC = (ChatTableViewController*)[storyboard instantiateViewControllerWithIdentifier:@"chatVC"];
[self dismissViewControllerAnimated:YES completion:^{
[[self navigationController] pushViewController:chatVC animated:YES];
}];
模態視圖消失了,但是此后什么也沒有發生。 有任何想法嗎?
您不能將視圖控制器推入已關閉的視圖中,如果已將其關閉,則它會消失,因此不推另一個視圖是不合邏輯的,這會導致父視圖控制器被刪除。 可能是這樣的:-ViewController 1-> Modal ViewController 2->想關閉VC2並推送VC3
您要做的是-ViewController 1-> Modal ViewController 2-> Dismiss VC2->在VC1上推送VC3
您可以通過通知來完成。 最有效的方法是使用委托,在VC2上創建一個委托,當V1關閉時通知V1,然后直接推送VC3。
不,據我所知,它不能如此迅速地完成,您需要在解雇和另一個控制器的導航之間添加一個延遲,然后才執行,否則它將崩潰,並導致錯誤提示,試圖在解雇時推一個控制器其他
這個答案試圖解決上面提出的原始問題。
A,B,C viewControllers。 A是navigationController的根VC。
A-> modally_presents-> B-> dismissing_modally_prsented_B_and_automatically_pushing-> C
注意:所有演示和解雇都是使用segues完成的。 我已經指出了重要的行動順序。
class CViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
/************************************************************/
protocol BDelegate: class {
func BDelegateFunc(someRandomString: String)
}
class BViewController: UIViewController {
weak var delegate: BDelegate?
var name: String?
override func viewDidLoad() {
super.viewDidLoad()
name = "swappy"
}
@IBAction func btnClicked(_ sender: Any) {
// 3 DISMISS using segue
performSegue(withIdentifier: "unwindToAViewController", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// 4
print(segue.identifier)
}
deinit {
// 6
print(String(describing: type(of: self)) + #function)
delegate?.BDelegateFunc(someRandomString: name!)
}
}
/************************************************************/
class AViewController: UIViewController, BDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnClicked(_ sender: Any) {
// 1 MODAL
performSegue(withIdentifier: "presentBFromA", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "presentBFromA" {
// 2
let vc = segue.destination as! BViewController
vc.delegate = self
} else if segue.identifier == "showCFromA" {
// 8 This will finally push C in navigationController
print(segue.identifier)
}
}
@IBAction func unwindToAViewController(segue: UIStoryboardSegue) {
// 5
print(#function)
}
func BDelegateFunc(someRandomString: String) {
// 7
print(someRandomString)
performSegue(withIdentifier: "showCFromA", sender: self)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.