【问题标题】:How to programmatically create a "Back" UIBarButton item in Swift?如何以编程方式在 Swift 中创建“返回”UIBarButton 项?
【发布时间】:2015-12-15 01:00:34
【问题描述】:

我能够创建一个 UIBarButton 项,它可以使用以下代码以编程方式返回:

    func backAction() -> Void {        
        self.navigationController?.popViewControllerAnimated(true)
    }
override func viewDidLoad() {
        super.viewDidLoad()
    let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "backAction")

        self.navigationItem.leftBarButtonItem = backButton
    }

问题是后退按钮没有左箭头: 有没有办法让它看起来像一个带有箭头的常规后退按钮:

如果可能的话,我也想知道是否有办法将按钮标题名称作为前一个视图控制器的标题。

谢谢

【问题讨论】:

  • 你是如何导航到可见控制器的?是presentViewController还是pushViewController?
  • 它是通过“模态呈现”而不是通过导航控制器

标签: ios swift uibarbuttonitem


【解决方案1】:

下面是使用带有图像的 UIButton 的代码,您可以将其添加为 UIBarButtonItem 的 customView

override func viewDidLoad() {
    super.viewDidLoad()
    var backbutton = UIButton(type: .Custom)
    backbutton.setImage(UIImage(named: "BackButton.png"), forState: .Normal) // Image can be downloaded from here below link 
    backbutton.setTitle("Back", forState: .Normal)
    backbutton.setTitleColor(backbutton.tintColor, forState: .Normal) // You can change the TitleColor
    backbutton.addTarget(self, action: "backAction", forControlEvents: .TouchUpInside)

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backbutton)
}

func backAction() -> Void {        
   self.navigationController?.popViewControllerAnimated(true)
}

Download Link

要使用前一个视图控制器标题设置后退按钮的标题,您必须在呈现控制器时将标题作为字符串传递,将上述代码更改为

var titleStrFromPreviousController: String // This value has to be set from previous controller while presenting modal controller
backbutton.setTitle(titleStrFromPreviousController, forState: .Normal)

这可能会有所帮助。

斯威夫特 3

override func viewDidLoad() {
    super.viewDidLoad()

    addBackButton()
}

func addBackButton() {
    let backButton = UIButton(type: .custom)
    backButton.setImage(UIImage(named: "BackButton.png"), for: .normal) // Image can be downloaded from here below link
    backButton.setTitle("Back", for: .normal)
    backButton.setTitleColor(backButton.tintColor, for: .normal) // You can change the TitleColor
    backButton.addTarget(self, action: #selector(self.backAction(_:)), for: .touchUpInside)

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
}

@IBAction func backAction(_ sender: UIButton) {
   let _ = self.navigationController?.popViewController(animated: true)
}

【讨论】:

【解决方案2】:

为 Swift 4.2 更新 - 感谢 sam bing 和 silentbeep

对一些颜色和动作的选择器做了一些修改。

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .blue
        self.navigationItem.title = title
        self.navigationController?.navigationBar.barTintColor = .white
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: makeBackButton())
    }

    func makeBackButton() -> UIButton {
        let backButtonImage = UIImage(named: "backbutton")?.withRenderingMode(.alwaysTemplate)
        let backButton = UIButton(type: .custom)
        backButton.setImage(backButtonImage, for: .normal)
        backButton.tintColor = .blue
        backButton.setTitle("  Back", for: .normal)
        backButton.setTitleColor(.blue, for: .normal)
        backButton.addTarget(self, action: #selector(self.backButtonPressed), for: .touchUpInside)
        return backButton
    }

    @objc func backButtonPressed() {
        dismiss(animated: true, completion: nil)
//        navigationController?.popViewController(animated: true)
    }

【讨论】:

  • 使用此解决方案,您将获得自定义按钮,但您将失去从左到右的拖动以返回上一个视图控制器。返回的唯一方法是按下按钮。
【解决方案3】:

您可以通过将视图嵌入导航控制器来实现。 这是一张显示如何做到这一点的图片:

希望对你有帮助:D

【讨论】:

  • 它应该默认出现
  • 如果您想获得返回按钮,您需要展示或推送到该导航控制器
【解决方案4】:

对于以后的搜索,我想补充一点,您现在可以通过以下代码使用默认图标:

override public func viewDidLoad() {
    // create chevron image
    let config = UIImage.SymbolConfiguration(pointSize: 25.0, weight: .medium, scale: .medium)
    let image = UIImage(systemName: "chevron.left", withConfiguration: config)

    // create back button
    let backButton = UIButton(type: .custom)
    backButton.addTarget(self, action: #selector(self.close(_:)), for: .touchUpInside)
    backButton.setImage(image, for: .normal)
    backButton.setTitle("Back", for: .normal)
    backButton.setTitleColor(backButton.tintColor, for: .normal)
    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
}

@IBAction func close(_ sender: UIButton) {
    self.navigationController?.dismiss(animated: true, completion: nil)
}

【讨论】:

    【解决方案5】:

    第一个答案效果很好,但是图像有点太大了,所以使用预览并将其缩小到宽度:13 和高度:22,还将其渲染模式设置为 .alwaysTemplate 并更改 UIButton 的着色为白色,同时还在字符串前添加两个空格:“Back”。这将产生类似于导航栏后退按钮的安静效果,图像在大小和位置方面可能会更好。

    修改后的代码:

         func addBackButton() {
    
    
                let backButtonImage = UIImage(named: "BackButton.png")?.withRenderingMode(.alwaysTemplate)
    
                let backButton = UIButton(type: .custom)
                backButton.setImage(backButtonImage, for: .normal) 
                backButton.tintColor = .white
                backButton.setTitle("  Back", for: .normal)
                backButton.setTitleColor(.white, for: .normal)
                backButton.addTarget(self, action: #selector(self.backAction(_:)), for: .touchUpInside)
    
                self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
    
    
    }
    

    【讨论】:

      【解决方案6】:

      我更改了所选答案的最后一行代码,它对我有用。

      override func viewDidLoad() {
          super.viewDidLoad()
      
          addBackButton()
      }
      
      func addBackButton() {
          let backButton = UIButton(type: .custom)
          backButton.setImage(UIImage(named: "BackButton.png"), for: .normal) // Image can be downloaded from here below link
          backButton.setTitle("Back", for: .normal)
          backButton.setTitleColor(backButton.tintColor, for: .normal) // You can change the TitleColor
          backButton.addTarget(self, action: #selector(self.backAction(_:)), for: .touchUpInside)
      
          self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
      }
      
      @IBAction func backAction(_ sender: UIButton) {
         let _ = self.dismiss(animated: true, completion: nil)
      }
      

      【讨论】:

        【解决方案7】:

        斯威夫特 5

        override func viewDidLoad() {
                    super.viewDidLoad()
                    let backbutton = UIButton(type: .custom)
                    backbutton.setImage(UIImage(named: "BackButton.png"), for: .normal) // Image can be downloaded from here below link
                    backbutton.setTitle("Back", for: .normal)
                    backbutton.setTitleColor(backbutton.tintColor, for: .normal) // You can change the TitleColor
                    backbutton.addTarget(self, action: Selector(("backAction")), for: .touchUpInside)
            
                    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backbutton)
                }
            
                func backAction() -> Void {
                    self.navigationController?.popViewController(animated: true)
                }
        

        【讨论】:

          猜你喜欢
          • 2015-06-22
          • 1970-01-01
          • 1970-01-01
          • 2017-03-31
          • 2017-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多