簡體   English   中英

如何在按下時使UIBarButtonItem執行一個函數?

[英]How to make a UIBarButtonItem perform a function when pressed?

我正在嘗試使用此代碼創建自定義后退按鈕:

let back = UIImage(named: "header_backarrow")
let backView = UIImageView(image: back)
let backItem = UIBarButtonItem(customView: backView)
navigationItem.leftBarButtonItem = backItem

我希望導航項執行此代碼:

func dismissManual() {
    dismiss(animated: true, completion: nil)
}

我已經嘗試過很多東西,例如關注這個Stack Overflow帖子: 當按下UINavigationController的后欄按鈕時執行動作

我也試過把它變成一個navigationItem.backBarButtonItem ; 然而,似乎沒有任何作用。 有些東西顯示正確的自定義圖像,但不作為按鈕工作; 另一方面,有些工作作為按鈕,但沒有顯示正確的圖像。

有人知道如何顯示正確的圖像並使項目作為按鈕工作嗎? 謝謝。

做到如下:

override func viewDidLoad() {
        super.viewDidLoad()

        let back = UIImage(named: "header_backarrow")
        let backView = UIImageView(image: back)
        backView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissManual))
        backView.addGestureRecognizer(tap)
        let backItem = UIBarButtonItem(customView: backView)
        navigationItem.leftBarButtonItem = backItem
    }

    @objc func dismissManual() {
        print("print----")
//        dismiss(animated: true, completion: nil)
    }

添加手勢到backView它將工作! 這個問題類似IOS - Swift - 向BarButtonItem的customView添加目標和動作

Swift 4.1

問題是UIImage沒有輕敲識別。 您必須在backView中添加一個點擊手勢識別器。

    lazy var singleTap: UITapGestureRecognizer = {
    let singleTap = UITapGestureRecognizer(target: self, action: #selector(tapDetected))
    singleTap.numberOfTapsRequired = 1
    return singleTap
}()

// Actions
@objc func tapDetected() {
    dismiss(animated: true, completion: nil)
}

如果你展示你的代碼,通過一些屏幕截圖我可以提供更多的幫助,如果這不能解決問題。

您正在錯誤地創建UIBarButtonItem 您不需要圖像視圖。

做到如下:

let back = UIImage(named: "header_backarrow")
let backItem = UIBarButtonItem(image: back, style: .plain, target: self, action: #selector(dismissManual))
navigationItem.leftBarButtonItem = backItem

@objc func dismissManual() {
    dismiss(animated: true, completion: nil)
}

請注意,該函數必須用@objc標記。

根據您的圖像以及您希望的顯示方式,您可能需要按如下方式創建圖像:

let back = UIImage(named: "header_backarrow").withRenderingMode(.alwaysOriginal)

另一種選擇是使用圖像和設置創建一個UIButton來調用你的dismissManual函數。 使用按鈕作為自定義視圖創建UIBarButtonItem

但是當你擁有的只是一個簡單的圖像或一個簡單的字符串時,創建一個標准的UIBarButtonItem更容易。

let barButtonItem = UIBarButtonItem(image: UIImage(named: "backImgs"),
                                            style: .plain,
                                            target: self,
                                            action: #selector(menuButtonTapped))

// Adding button to navigation bar (rightBarButtonItem or leftBarButtonItem)
self.navigationItem.rightBarButtonItem = barButtonItem

 // Private action
@objc fileprivate func menuButtonTapped() { // body method here }

看看這個,它可能會有所幫助謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM