快速解除模式并推送到新的 VC

Posted

技术标签:

【中文标题】快速解除模式并推送到新的 VC【英文标题】:swift dismiss modal and push to new VC 【发布时间】:2015-11-19 14:24:36 【问题描述】:

我有 tableview... 1 个表格显示一个新的模态窗口,当我按下按钮时,我想关闭模态窗口并推送到 VC。我的代码只隐藏了模态视图,但没有推送。

    @IBAction func registrationBtn(sender: AnyObject) 

    let openNewVC = self.storyboard?.instantiateViewControllerWithIdentifier("registrationVcID") as! RegistrationVC

    self.dismissViewControllerAnimated(false, completion:  () -> Void   in
         self.navigationController?.pushViewController(openNewVC, animated: true)

            )

【问题讨论】:

【参考方案1】:

你应该创建一个协议

protocol View1Delegate: class 
    func dismissViewController(controller: UIViewController)

当您点击注册按钮时,会将委托回调到 TableView。 TableViewController 应该实现:

  func dismissViewController(controller: UIViewController) 
    controller.dismissViewControllerAnimated(true)  () -> Void in
        //Perform segue or push some view with your code

    

你可以在这里做任何事情。推你想要的屏幕。详细实现可以看我的demo:Demo Push View in Swift

【讨论】:

哇!太感谢了。我将您的项目应用于我的问题并解决了它!我喜欢它。 对于我们新手 - “创建协议” - 在哪里? @Donnelle 查看演示 我爱你。我不开玩笑,只是花了大约 8 个小时来尝试学习 Swift 的这一部分并在解决我在应用程序中遇到的问题时理解它。你刚刚用你的演示解决了我的问题。你是英雄。【参考方案2】:

更新了 Swift 3 和 4 的语法

关闭视图控制器

self.dismiss(animated: true, completion: nil)

或者如果您想在完成块中做某事(在视图被关闭后),您可以使用...

self.dismiss(animated: true, completion: 
            // Your code here
        )

【讨论】:

【参考方案3】:

self.navigationController 不会在该完成块内执行任何操作,因为它已被解除。

改为创建一个委托,在关闭当前视图控制器时调用父视图控制器。

protocol PushViewControllerDelegate: class 
    func pushViewController(vc: UIViewController)

然后在您关闭的 VC 中,您可以存储委托并在完成块中调用它。

weak var delegate: PushViewControllerDelegate?

self.dismissViewControllerAnimated(false, completion:  () -> Void   in

    let openNewVC = self.storyboard?.instantiateViewControllerWithIdentifier("registrationVcID") as! RegistrationVC
    self.delegate?.pushViewController(openNewVC)

以及您的呈现视图控制器中的实现

//declaration
class OneController: UIViewController, PushViewControllerDelegate

//show modal
let twoController = TwoController()
twoController.delegate = self
self.presentViewController(twoController, animated:true)

//MARK: PushViewControllerDelegate

func pushViewController(vc: UIViewController) 
    self.navigationController?.push(vc, animated:true)

【讨论】:

不,这不起作用。它将关闭并且没有推送发生 是的。这也行不通,对不起。但是,委托解决方案应该可以工作...... 我把协议和穿var delegate + 方法放在Modal window VC中。我应该把 pushViewController 放在哪里? 在显示模态的VC中。该 VC 需要实现委托,然后在显示之前在模态 VC 中将自己设置为委托。 好吧,我现在迷路了....我有这样的设置:1) FavouriteVC(TableView-embed in navigation controller) -> 2) CreateProfileVC(Modal window) -> 3) RegistrationVC (final查看导航控制器)我的问题是......如何设置您的解决方案?

以上是关于快速解除模式并推送到新的 VC的主要内容,如果未能解决你的问题,请参考以下文章

git 创建分支并推送到远程分支

如何在 Vue 中求和并推送到匹配的对象

完全撤消提交并推送到远程[重复]

markdown 创建新的本地分支并推送到Github

新建分支并推送到远程仓库

新建分支并推送到远程仓库