通过导航控制器进行调试

时间:2015-09-04 12:11:13

标签: ios xcode swift

enter image description here

所以我在[2]中有一个按钮,它通过导航控制器推送到[3]所以我可以使用工具栏中的“后退”按钮返回[2]。一切正常。

在[4]中我也有一个按钮,我希望它转到[3]。但是它也应该通过导航控制器,这样当我按“返回”时我可以再次返回[2]。

所以实际上我希望[4]上的按钮像[1] [2] [3]一样,以便我可以从[3]返回[2]

@IBAction func showKaart(sender: AnyObject) {
 performSegueWithIdentifier("menuToKaart", sender: sender)
}

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,我相信会尝试。

请注意您的根视图控制器是vc[2],好吗? 你从vc[2]>推出vc[3],然后按下并返回vc[2],这没关系! 你从vc[4]>推出vc[3],然后按下并返回vc[4],但您需要返回vc[2]

对于此逻辑,您可以为vc[3]

创建自定义行为

对于你的vc[3],我这样做是为了控制行为。

class ViewController3:UIViewController{

    var backToRoot:Bool = false;

    override func viewDidLoad() {
        super.viewDidLoad();
        self.hideAndAddNewBackButton();
    }

    private func hideAndAddNewBackButton(){
        self.navigationItem.hidesBackButton = true
        let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "back:")
        self.navigationItem.leftBarButtonItem = newBackButton;
    }

    func back(sender: UIBarButtonItem) {
        if backToRoot{
            self.navigationController?.popToRootViewControllerAnimated(true);
        }else{
            self.navigationController?.popViewControllerAnimated(true)
        }
    }

    func needBackToRoot(){
        backToRoot = true;
    }
}

现在在vc[4]我认为您可以修改vc[3]的后退按钮行为 我介意用你的vc[4]

做两种方式

首先使用performSegue。

class ViewController4PerfomSegue:UIViewController{

    @IBAction func pressButtonToPushViewController3(sender:AnyObject?){
        self.performSegueWithIdentifier("showViewController3", sender: nil);
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let viewController3 = segue.destinationViewController as? ViewController3{
            viewController3.needBackToRoot();
        }
    }

}

第二步使用导航视图控制器中的推送手册

class ViewController4Push:UIViewController{

    @IBAction func pressButtonToPushViewController3(sender:AnyObject?){
        let viewController3 = ViewController3(nibName: "ViewController3", bundle: nil);
        viewController3.needBackToRoot();
        self.navigationController?.pushViewController(viewController3, animated: true);
    }
}

编辑:从故事板中实例化的新方法

class ViewController4Push:UIViewController{

    @IBAction func pressButtonToPushViewController3(sender:AnyObject?){
        if let viewController3 = storyboard!.instantiateViewControllerWithIdentifier("ViewController3") as? ViewController3{
            viewController3.needBackToRoot();
            self.navigationController?.pushViewController(viewController3, animated: true);
        }
    }
}

修改:删除新视图时

class ViewController4Push:UIViewController, UINavigationControllerDelegate{

    @IBAction func pressButtonToPushViewController3(sender:AnyObject?){
        if let viewController3 = storyboard!.instantiateViewControllerWithIdentifier("ViewController3") as? ViewController3{
            viewController3.needBackToRoot();
            self.navigationController?.delegate = self;
            self.navigationController?.pushViewController(viewController3, animated: true);
        }
    }

    func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
        self.navigationController?.delegate = nil;
        self.dismissViewControllerAnimated(false, completion: nil);
        //or self.removeFromParentViewController();
    }
}

如果我理解了问题,我希望能帮助你

编辑:在与思南聊天后,我们用简单的方法解决它,只需强制回复呈现应用程序的根元素

class ViewCustomController:UIViewController{

    override func viewDidLoad() {
        super.viewDidLoad();
        self.hideAndAddNewBackButton();
    }

    private func hideAndAddNewBackButton(){
        self.navigationItem.hidesBackButton = true
        let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "back:")
        self.navigationItem.leftBarButtonItem = newBackButton;
    }

    func back(sender: UIBarButtonItem) {
        if let viewControllerRoot = storyboard!.instantiateViewControllerWithIdentifier("ViewControllerRoot") as? ViewControllerRoot{
            self.navigationController?.pushViewController(viewController2, animated: true);
        }
    }
}

答案 1 :(得分:0)

[4]需要嵌入导航控制器中。之后,将@IBAction更改为使用pushViewController:Animated:上的navigationController代替performSegueWithIdentifier