Как заставить UIBarButtonItem выполнять функцию при нажатии? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь создать пользовательскую кнопку возврата, используя этот код:

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

Я пробовал много вещей, таких какследуя этому сообщению о переполнении стека: Выполнить действие при нажатии кнопки задней панели UINavigationController

Я также попытался сделать его navigationItem.backBarButtonItem;Однако, кажется, ничего не работает.Некоторые вещи показывают правильное пользовательское изображение, но не работают как кнопки;с другой стороны, некоторые работают как кнопки, но не показывают правильное изображение.

Кто-нибудь знает, как я могу показать правильное изображение и заставить элемент работать как кнопка?Спасибо.

Ответы [ 4 ]

0 голосов
/ 13 июня 2018
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 }

Проверьте это, это может помочь Спасибо.

0 голосов
/ 13 июня 2018

Вы неправильно создаете 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, когда все, что у вас есть, это простое изображение или простая строка.

0 голосов
/ 13 июня 2018

Сделайте это следующим образом:

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

0 голосов
/ 13 июня 2018

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

Если вы покажете свой код, с некоторыми снимками экрана я могу помочь, если это не решит проблему.

...