Ios 如何从通过Show Detail segue推送的堆栈中手动弹出视图控制器?

Ios 如何从通过Show Detail segue推送的堆栈中手动弹出视图控制器?,ios,swift,uiviewcontroller,Ios,Swift,Uiviewcontroller,我有一个类型序列:显示详细信息链接到UITableViewCell来自主视图控制器。在viewDidLoad中的详细视图控制器中,我尝试覆盖leftBarButtonItem: navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "icon-menu"), style: .Plain, target: self, action: Selector("menuButtonTapped:")) 我调用的方

我有一个类型序列:
显示详细信息
链接到
UITableViewCell
来自主视图控制器。在
viewDidLoad
中的详细视图控制器中,我尝试覆盖
leftBarButtonItem

navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "icon-menu"), style: .Plain, target: self, action: Selector("menuButtonTapped:"))
我调用的方法如下所示:

func menuButtonTapped(sender: UIBarButtonItem) {
    navigationController?.popViewControllerAnimated(true)
}

但它不想工作。方法,但没有弹出操作,因为
navigationController
viewControllers
数组中只有一个控制器。当我不尝试覆盖
leftBarButtonItem
时,一切正常,有一个默认的后退按钮,当我点击它时,控制器从堆栈中弹出。出了什么问题?

鉴于问题中使用了主视图控制器和详细视图控制器,我假设您使用的是
UISplitViewController
。如果是这种情况,则在
UINavigationController
中找不到您的详细视图控制器。您一定要检查
UISplitViewController

其次,
UISplitViewController
自动生成在表视图上选择单元格时显示的
UIBarButtonItem
。这个按钮背后的逻辑在我之前发布的链接中有解释。如果你只需要定制它的外观,我建议你也检查一下。取代这个
uibarbuttoneim
对于你想要实现的目标来说,似乎是杀伤力过大

此外,我不太清楚为什么需要覆盖按钮的操作。由于这是一个
UISplitViewController
,因此该按钮不会在所有可能的界面上都可见。因此,您的自定义操作并不总是要执行。您不能在详图视图控制器的
viewwilldemouse:
viewdidemouse:
方法上执行自定义代码吗

最后,如果上述解决方案仍然不符合您的需要,您可以采取以下措施:

class DetailViewController: UIViewController: UISplitViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.splitViewController?.delegate = self
    }

    func splitViewController(svc: UISplitViewController, willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode) {
        if displayMode == .PrimaryHidden {
            self.previousButton = navigationItem.leftBarButtonItem
            navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "icon-menu"), style: .Plain, target: self, action: Selector("menuButtonTapped:"))
        }
    }

    private var previousButton: UIBarButtonItem?

    @objc func menuButtonTapped(sender: UIBarButtonItem) {
        //your custom code

        if let target = self.previousButton?.target as? NSObject {
            target.performSelector(self.previousButton!.action)
        }
    }  

}
我还没有测试过,但我想你会明白的


另外:请注意,这有点粗糙,我只建议您将其作为最后一个资源使用。

鉴于在问题中使用了主视图控制器详细视图控制器,我假设您使用的是
UISplitViewController
。如果是这种情况,则在
UINavigationController
中找不到您的详细视图控制器。您一定要检查
UISplitViewController

其次,
UISplitViewController
自动生成在表视图上选择单元格时显示的
UIBarButtonItem
。这个按钮背后的逻辑在我之前发布的链接中有解释。如果你只需要定制它的外观,我建议你也检查一下。取代这个
uibarbuttoneim
对于你想要实现的目标来说,似乎是杀伤力过大

此外,我不太清楚为什么需要覆盖按钮的操作。由于这是一个
UISplitViewController
,因此该按钮不会在所有可能的界面上都可见。因此,您的自定义操作并不总是要执行。您不能在详图视图控制器的
viewwilldemouse:
viewdidemouse:
方法上执行自定义代码吗

最后,如果上述解决方案仍然不符合您的需要,您可以采取以下措施:

class DetailViewController: UIViewController: UISplitViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.splitViewController?.delegate = self
    }

    func splitViewController(svc: UISplitViewController, willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode) {
        if displayMode == .PrimaryHidden {
            self.previousButton = navigationItem.leftBarButtonItem
            navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "icon-menu"), style: .Plain, target: self, action: Selector("menuButtonTapped:"))
        }
    }

    private var previousButton: UIBarButtonItem?

    @objc func menuButtonTapped(sender: UIBarButtonItem) {
        //your custom code

        if let target = self.previousButton?.target as? NSObject {
            target.performSelector(self.previousButton!.action)
        }
    }  

}
我还没有测试过,但我想你会明白的


另外:请注意,这有点粗糙,我只建议您作为最后一个参考资料来做这件事。

您想做什么?您需要覆盖
leftBarButtonItem
的实现还是要自定义按钮?需要自定义按钮,但我还需要自定义操作。。。但它不起作用。你想实现什么?您需要覆盖
leftBarButtonItem
的实现还是要自定义按钮?需要自定义按钮,但我还需要自定义操作。。。但它不起作用。