【问题标题】:Swift Custom Back Button and DestinationSwift 自定义后退按钮和目的地
【发布时间】:2014-09-10 17:55:05
【问题描述】:

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

因此,我想在目标视图控制器上手动创建一个返回按钮,该按钮将返回到主视图控制器。

我看过这里的代码:How do I manually set the "Back" destination in iOS apps

但我正在努力在 Swift 中实现这一点(一个接一个的错误!)。有什么帮助吗?谢谢!

编辑

我已经尝试了下面的建议,但是后退按钮没有出现。这可能与我将导航栏隐藏在其他视图中并在目标视图上执行以下操作有关:

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)
}

不确定为什么后退按钮不显示?

编辑

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

- (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];
    };

}

}

【问题讨论】:

  • 你解决了吗,我也遇到了同样的问题

标签: ios swift uinavigationcontroller


【解决方案1】:

你可以像这样快速写出来

写这个来在navigationController上添加按钮

    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

这将弹出到rootViewController

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

【讨论】:

  • 感谢回复,我在上面的帖子里加了一点
  • 因为你隐藏了导航栏它不会显示。为什么你隐藏navigationBar
  • 因为我的大多数应用程序都不需要它,但我允许它在这个视图上显示。当我应用上面的代码时,后退按钮不会出现。导航栏标题显示正常
  • 将按钮放置在任何位置设置相应的框架。查看我编辑的答案
  • 这意味着我将失去股票左箭头对吗?有什么办法可以保留吗?
【解决方案2】:

Swift 3.0 解决方案:

    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)
    }

【讨论】:

    【解决方案3】:

    Swift 2.1

    我以这种方式自定义导航栏项目

    • 我可以更改导航栏背景图片、标题文本、文本颜色
    • 我可以显示/隐藏返回按钮
    • 我可以更改标题/图标或自定义操作方法

    在 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)
    
        }
    

    【讨论】:

      【解决方案4】:

      这是 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
      

      【讨论】:

        【解决方案5】:

        Swfit 5 / XCode 11.4

        override func viewDidLoad() {
            super.viewDidLoad()
        
            navigationController!.setNavigationBarHidden(false, animated: true)
            let myBackButton:UIButton = UIButton(type: UIButton.ButtonType.custom) as UIButton
            myBackButton.addTarget(self, action: #selector(popToRoot), for: UIControl.Event.touchUpInside)
            myBackButton.setTitle("YOUR TITLE", for: UIControl.State.normal)
            myBackButton.setTitleColor(UIColor.white, for: UIControl.State.normal)
            myBackButton.sizeToFit()
            let myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton)
             self.navigationItem.leftBarButtonItem  = myCustomBackButtonItem
        }
        

        另外,popToRoot 你应该标记为@objc

         @objc func popToRoot() {
                //enter action here
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-09
          • 2020-01-18
          • 1970-01-01
          • 2013-09-20
          相关资源
          最近更新 更多