Swift自定义后退button和目的地

我目前使用SWRevealViewController在我的应用程序中的侧边栏菜单。 当我单击其中一个选项时,目标视图控制器没有“返回”button,因为它不是来自正确的视图控制器(即返回的页面)。

因此,我想在目标视图控制器上手动创build一个返回button,这将返回到主视图控制器。

我已经看过这里的代码: 如何在iOS应用程序中手动设置“返回”目的地

但我正在努力在Swift中实现这个(一个接一个的错误!)。 任何帮助? 谢谢!

编辑

我已经尝试了下面的build议,但后退button只是不出现。 这可能有一些事实,我有隐藏在其他视图中的navbar,并在目标视图上执行以下操作:

override func viewDidLoad() { super.viewDidLoad() navigationController.setNavigationBarHidden(false, animated:true) var myBackButton:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton myBackButton.addTarget(self, action: "popToRoot:", forControlEvents: UIControlEvents.TouchUpInside) var myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton) self.navigationItem.leftBarButtonItem = myCustomBackButtonItem } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func popToRoot(sender:UIBarButtonItem){ self.navigationController.popToRootViewControllerAnimated(true) } 

不知道为什么后退button不会显示?

编辑

这是从我的侧边栏视图控制器prepareForSegue。 如果有方法来检查segue标识符“testing”,那么我可以从这里设置后退button?

 - (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender { // Set the title of navigation bar by using the menu items NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController; destViewController.title = [[_menuItems objectAtIndex:indexPath.row] capitalizedString]; if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) { SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue; swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) { UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController; [navController setViewControllers: @[dvc] animated: NO ]; [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES]; }; } } 

你可以像这样快速写出来

写这个在navigationController上添加button

  navigationController.setNavigationBarHidden(false, animated:true) var myBackButton:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton myBackButton.addTarget(self, action: "popToRoot:", forControlEvents: UIControlEvents.TouchUpInside) myBackButton.setTitle("YOUR TITLE", forState: UIControlState.Normal) myBackButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal) myBackButton.sizeToFit() var myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton) self.navigationItem.leftBarButtonItem = myCustomBackButtonItem 

这将popup到rootViewController

  func popToRoot(sender:UIBarButtonItem){ self.navigationController.popToRootViewControllerAnimated(true) } 

Swift 2.1中

我正在自定义导航栏项目

  • 我可以改变导航栏的背景图片,标题文字,文字颜色
  • 我可以显示/隐藏返回button
  • 我可以更改标题/图标或自定义操作方法

在AppDelegate我有

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //Cutomize navigation bar let navBgImage:UIImage = UIImage(named: "dummy_navigation_bg_image")! UINavigationBar.appearance().setBackgroundImage(navBgImage, forBarMetrics: .Default) UINavigationBar.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]; return true } 

在ViewController中,我使用viewWillAppear方法更新导航项目

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) setupNavigationBar() } // MARK: - NavigationBar methods func setupNavigationBar () { //current tab screen title tabBarController?.title = "Manage" //Hide back button or left bar button tabBarController?.navigationItem.leftBarButtonItem = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil) //custom right bar button var image = UIImage(named: "dummy_settings_icon") image = image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) tabBarController?.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style: UIBarButtonItemStyle.Plain, target: self, action: "settingButtonAction") } func settingButtonAction() { print("Setting Button tapped") performSegueWithIdentifier("loadAccountSettingsSegue", sender: nil) } 

Swift 3.0解决scheme:

  self.navigationController?.setNavigationBarHidden(false, animated:false) //Create back button of type custom let myBackButton:UIButton = UIButton.init(type: .custom) myBackButton.addTarget(self, action: #selector(ViewController.popToRoot(sender:)), for: .touchUpInside) myBackButton.setTitle("Back".localized(), for: .normal) myBackButton.setTitleColor(.blue, for: .normal) myBackButton.sizeToFit() //Add back button to navigationBar as left Button let myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton) self.navigationItem.leftBarButtonItem = myCustomBackButtonItem func popToRoot(sender:UIBarButtonItem){ _ = self.navigationController?.popToRootViewController(animated: true) } 

这是Swift 2 / 2.1的更新版本:

 self.navigationController? .setNavigationBarHidden(false, animated:true) let backButton = UIButton(type: UIButtonType.Custom) backButton.addTarget(self, action: "methodCall:", forControlEvents: UIControlEvents.TouchUpInside) backButton.setTitle("TITLE", forState: UIControlState.Normal) backButton.sizeToFit() let backButtonItem = UIBarButtonItem(customView: backButton) self.navigationItem.leftBarButtonItem = backButtonItem