如何解除模态,然后立即推送另一个视图?
我在didSelectRowAtIndexPath中添加此代码:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ChatTableViewController *chatVC = (ChatTableViewController*)[storyboard instantiateViewControllerWithIdentifier:@"chatVC"];
[self dismissViewControllerAnimated:YES completion:^{
[[self navigationController] pushViewController:chatVC animated:YES];
}];
模态视图解散,但之后没有任何反应。有什么想法吗?
答案 0 :(得分:8)
您无法将视图控制器推送到视图中,如果它被解除,它会消失,因此推送另一个视图是不合逻辑的,导致父视图控制器被删除。可能你有这个: - ViewController 1 - > Modal ViewController 2 - >想要解散VC2并推送VC3
你要做的是 - ViewController 1 - > Modal ViewController 2 - >解散VC2 - >在VC1上按VC3
您可以通过通知执行此操作。最有效的方法是使用委托,在VC2上创建一个委托,当它解散时通知V1,然后只推送VC3。
答案 1 :(得分:0)
不,就我所知,它不能很快完成,你需要在另一个控制器的消失和导航之间添加一个延迟,然后它会执行其他它会崩溃错误说,试图推动一个控制器同时解雇其他
答案 2 :(得分:0)
这个答案试图解决上面提到的原始问题。
A,B,C viewControllers。 A是navigationController的根VC。
A-> modally_presents - > B-> dismissing_modally_prsented_B_and_automatically_pushing - > ç
注意:所有演示和解雇都是使用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)
}
}