斯威夫特|关闭ViewController并推送其他ViewController

时间:2017-09-29 14:16:16

标签: ios swift xcode

解决了它:我忘了在VC1中声明tvx.selectionDelegate = self,这就是为什么它从未执行过

我搜索了很长时间并在网上为我的问题提供了两个类似的答案: here

但是所有这些都与解雇然后呈现另一种观点有关,我想解雇并推送另一个ViewC。

我有3个ViewController:

VC1让它调用它:DownloadsViewController

VC2允许调用它:SelectActionController

VC3允许调用它:fileInfoView

VC1以模态方式呈现VC2,然后VC2应该解除,VC1应立即推送VC3。

我试过了:

VC2:

self.present(vx, animated: true, completion: nil) 

并将PUSH动画置于完成{}但它崩溃了。

我接下来要尝试的是委托代表,如果我按下VC2上的按钮,则调用VC1来解除VC2和推送VC3。喜欢这里:

VC2:

protocol PushViewControllerDelegate: class {
func pushViewController(_ controller: UIViewController)
}

class SelectActionController: UIViewController, UITableViewDelegate, UITableViewDataSource {
weak var delegate: PushViewControllerDelegate?

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{

    if self.delegate != nil {
        self.delegate?.pushViewController(self)}

VC1:

func pushViewController(_ controller: UIViewController) {

        controller.dismiss(animated: true) { () -> Void in

            self.performSegue(withIdentifier: self.segue2, sender: nil)

            //let vx = self.storyboard?.instantiateViewController(withIdentifier: "FileInfo") as! fileInfoView
            //self.navigationController?.pushViewController(vx, animated: false)

        }
    }

我尝试的Trird事情是创建一个全局变量,如果它解散,只需将Bool变量设置为true,VC1中的func应该识别它(我的意图)。唯一的问题是它没有认定解雇为ViewDidAppear或类似的东西。

所以这些都没有用。

有没有人有这个想法?

5 个答案:

答案 0 :(得分:1)

OP评论后

已编辑

只需使用协议。 让你的第一个控制器采用它,并添加所需的功能。 在第二个控制器中设置一个协议变量,该变量将第一个参考变量作为参考,并在您关闭第二个控制器时调用该函数。 您现在可以使用dismiss函数执行任何操作,传递数据,发送到其他控制器......

第一个视图控制器:

protocol CustomProtocol {
    func dismissed()
}

class AViewController: UIViewController, CustomProtocol {

    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func toVC2(_ sender: UIButton) {
        let VC = self.storyboard!.instantiateViewController(withIdentifier: "BViewController") as! BViewController
        VC.customProtocol = self
        VC.view.backgroundColor = .white
        self.present(VC, animated: true, completion: nil)
    }

    func dismissed() {
        let yourViewController = UIViewController()
        yourViewController.view.backgroundColor = .red
        guard let navigationController = self.navigationController else {return}
        navigationController.pushViewController(yourViewController, animated: true)
    }
}

第二个视图控制器:

class BViewController: UIViewController {

    var customProtocol: CustomProtocol?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func quit(_ sender: UIButton) {
        self.dismiss(animated: true) {
            guard let proto = self.customProtocol else {return}
            proto.dismissed()
        }
    }
}

答案 1 :(得分:0)

我希望您需要对

执行解雇操作
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath:

在" SelectActionController"对吗?

在这种情况下,您必须执行以下操作,

public func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath) {

if self.delegate != nil {
     dismiss(animated: true) {
        self.delegate?.pushViewController(self)}
    }
}

我已经分享了一个与您的情况相关的示例项目,请参考。 https://github.com/Bharath-MallowTech/StackoverflowSolutions/tree/master/viewcontrollerDismissAndPush

答案 2 :(得分:0)

你能发布一些关于你一直尝试过的代码吗?这里的self是什么?是VC1VC2还是VC3

您可以做的是查看协议,因此您将VC1用作delegate,当您解除VC2时,它也会调用它的委托showVC3()。然后,将delegate.showVC3()放入dismiss的完成块中。

// Declare it in VC1
@protocol MyDelegate {
    func showVC3()
}

class VC1: UIViewController, MyDelegate {
    var vc2: VC2ViewController = VC2ViewController()
    var vc3: VC3ViewController = VC3ViewController()

    func showVC2() {
        vc2.delegate = self
        self.present(self.vc2)
    }

    func showVC3() {
        self.present(self.vc3)
    }
}

// In VC2
class VC2: UIViewController {
    var delegate: MyDelegate?

    func closeVC2() {
        self.dismiss(animated: true, completion: {
            self.delegate?.showVC3()
        })
    }
}

不确定这是否有效,因为我现在在我的电脑上,所以还没有尝试过。但是根据你的需要改变它并测试它。

答案 3 :(得分:0)

根据你在Github的文件,我想你忘了申报

tvx.selectionDelegate = self

中的

func imagePressed

答案 4 :(得分:0)

即使我有相同的情况,在呈现视图控制器后,我需要推送到其他视图控制器。如果我们有vc1,vc2,vc3,我们从vc1提供vc2,然后在按钮点击vc2我们需要推送到vc3,我做的是,我将vc3设置为root视图控制器。您可以按照以下方式检查代码。

func goToHomeScreenPage(transition : Bool)
{
    let _navigation : UINavigationController!

    let startVC : TabbarViewController = Utilities.viewController(name: "TabbarViewController", onStoryboard: StoryboardName.Login.rawValue) as! TabbarViewController

    _navigation = UINavigationController(rootViewController: startVC)

    _navigation.setNavigationBarHidden(true, animated: true)

    let transitionOption = transition ? UIViewAnimationOptions.transitionFlipFromLeft : UIViewAnimationOptions.transitionFlipFromLeft
    gotoViewController(viewController: _navigation, transition: transitionOption)

}

上面的方法gotoviewcontroller()在下面,

func gotoViewController(viewController: UIViewController, transition: UIViewAnimationOptions)
{
    if transition != UIViewAnimationOptions.transitionCurlUp
    {
        UIView.transition(with: self.window!, duration: 0.5, options: transition, animations: { () -> Void in
            self.window!.rootViewController = viewController
        }, completion: { (finished: Bool) -> Void in
            // do nothing
        })
    } else {
        window!.rootViewController = viewController
    }
}

在顶部声明var window: UIWindow?,您可以在appdelegate中编写这些方法,并通过创建appdelegate实例来调用它们。