Доступ к функции rightBarButton из другого ViewController в Swift - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь получить доступ к функции rightBarButton для отображения корзины из другого ViewController, хотя я могу вызвать эту функцию, но она не будет отображать никакого изображения, т.е. изображение корзины

Ниже приведен код, показывающий, как я вызываю эту функцию.

override func viewDidLoad() {
            super.viewDidLoad()
            // Adding Right Bar Button Item
            let rightBarButton = RightBarButton()
            rightBarButton.addingRightButton()
    }

Ниже кодовое представление о функции rightBarButton.

class RightBarButton {

    var storyboard = UIStoryboard()
    var navigationItem = UINavigationItem()
    var navigationController = UINavigationController()

    func addingRightButton() {

        let image = UIImage(named: "cart") 

        let finalImage = resizeImage(image: image!, newWidth: 30)

        navigationItem.rightBarButtonItem = FFBadgedBarButtonItem(image: finalImage, target: self, action: #selector(rightButtonTouched))

        let button = navigationItem.rightBarButtonItem as? FFBadgedBarButtonItem

        cartCount { (cartCount) in
            print("Api calling done ...")
            print(cartCount)
            button?.badge = "\(cartCount)"
        }
    }

    @objc func rightButtonTouched() {
        // print("Event Called")
    }

    func cartCount(completion: @escaping (Int) -> Void) {
        // print("Api calling ...")
    }
}

Если я добавлю этот код в viewDidLoad(), изображение будет отображаться, и событие щелчка также будет работать.

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

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вам нужно получить экземпляр необходимого ViewController с помощью rightBarButton, скажем, neededViewController. И тогда вы можете назвать это как здесь:

neededViewController.viewDidLoad()

или создайте другой метод в классе neededViewController со следующим содержанием:

func addRB () {
// let rightBarButton = RightBarButton(image: UIImage(named: "imageName"), landscapeImagePhone: UIImage(named: "imageName"), style: .done, target: self, action: nil)   

   let nc = navigationController
   let navBar = nc?.navigationBar

   let but = UIBarButtonItem(image: UIImage(named: "imageName"), landscapeImagePhone: UIImage(named: "imageName"), style: .done, target: self, action: nil)

// try to create RightBarButton with defined images and a text and pass it instead of `but`
   navBar?.topItem?.setRightBarButton(but, animated: false)
}

и звоните neededViewController.addRB()

1 голос
/ 26 апреля 2019

Это не работает, потому что navigationItem в вашем классе RightBarButton не является частью какого-либо контроллера навигации (так как он создается вручную и не присоединяется явно).

Сделать созданный экземпляр FFBadgedBarButtonItem доступным для контроллера представления, чтобы вы могли добавить его правильно:

override func viewDidLoad() {
    super.viewDidLoad()
    // Adding Right Bar Button Item
    let rightBarButton = RightBarButton()
    rightBarButton.addingRightButton()

    navigationItem.rightBarButtonItem = rightBarButton.badgeBarItem // badgeBarItem is the property exposed to the view controller
}

Отредактированный RightBarButton класс:

class RightBarButton {

    var badgeBarItem: FFBadgedBarButtonItem?

    func addingRightButton() {

        let image = UIImage(named: "cart")

        let finalImage = resizeImage(image: image!, newWidth: 30)

        badgeBarItem = FFBadgedBarButtonItem(image: finalImage, target: self, action: #selector(rightButtonTouched))

        cartCount { [weak self] cartCount in
            print("Api calling done ...")
            print(cartCount)
            self?.badgeBarItem?.badge = "\(cartCount)"
        }
    }

    @objc func rightButtonTouched() {
        // print("Event Called")
    }

    func cartCount(completion: @escaping (Int) -> Void) {
        // print("Api calling ...")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...