Как вызвать функцию из другого класса

В моем rootviewcontroller у меня есть три вкладки под меню навигации, и каждая вкладка представляет собой список продуктов, в меню навигации у меня есть значок корзины с номером, чтобы показать количество значков в корзине. каждая вкладка представляет собой отдельный viewcontroller, и все они переименованы в rootviewcontroller следующим образом:

override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] {
    let layout = UICollectionViewFlowLayout()
    let firstTab = FirstTabController(collectionViewLayout: layout)
    let seccondTab = SeccondTabController(collectionViewLayout: layout)
    let thirdTab = ThirdTabController(collectionViewLayout: layout)

    return [firstTab ,seccondTab ,thirdTab ]
}

Я создал функцию в defaultviewcontroller для сброса номера корзины в меню навигации, но я не знаю, как запустить эту функцию из firsttabController

Это моя функция в firsttabcontroller

func AddToCart(sender:UIButton) {
    let activityIndicatorView = NVActivityIndicatorView(frame: self.view.frame, type: .circleStrokeSpin, color: .red, padding: 170)
    self.view.addSubview(activityIndicatorView)
    activityIndicatorView.startAnimating()

    let parameters : [String: Any] = [
        "productid": sender.tag ,
        "quantityid": 1
    ]

    ApiServiceCart.sharedInstance.addProductToCartCatalog(parameters: parameters) { (success) in
        activityIndicatorView.removeFromSuperview()
        if success == true {
            // here i want to fire DefaultController().setupNavigationMenu()
            self.displayMessage(Title: MessageTitle.Successfull.rawValue, Message: Message.AddToCart_Successfull.rawValue)
        }
        else {
            self.displayMessage(Title: MessageTitle.Error.rawValue, Message: Message.AddToCart_Error.rawValue)
        }
    }
}

Я пробовал делегировать протокол, но это не сработало

github.com/kavehnaseri/Protino/blob/master/Protino. функция, которую я хочу вызвать из контроллера по умолчанию, (setupNavBarButtonsWithCartOnLeft), которая находится в помощнике/расширении + UIViewController


person kaveh naseri    schedule 09.06.2018    source источник
comment
Возможный дубликат Вызов функции из другого ViewController в swift   -  person Fogmeister    schedule 09.06.2018
comment
Ваш точный заголовок вопроса содержит много повторяющихся вопросов о переполнении стека.   -  person Fogmeister    schedule 09.06.2018
comment
Покажите больше кода, касающегося вашего сброса: defaultviewcontroller, возможно, он у вас есть на github, чтобы я мог посмотреть и внести свой вклад   -  person AD Progress    schedule 09.06.2018
comment
@ADProgress, это ссылка: github.com/kavehnaseri/Protino/blob/master/ Протино . функция, которую я хочу вызвать из контроллера по умолчанию, (setupNavBarButtonsWithCartOnLeft), которая находится в помощнике/расширении + UIViewController   -  person kaveh naseri    schedule 10.06.2018
comment
Проверьте мой ответ ниже. Я добавил вызов этого метода в viewDidLoad, но вы можете добавить его везде, где это необходимо, поскольку он доступен.   -  person AD Progress    schedule 11.06.2018


Ответы (2)


Наконец-то нашел решение, надо было использовать NotificationCenter

Итак, у меня была функция с именем setupBarButtonMenu, созданная в расширении UIViewController, и я хотел просто вызвать ее в ParentViewController из ChildViewController. я добавил наблюдателя в ParentViewController следующим образом:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(self.setupNavBarButtonsWithCartOnLeft), name: NSNotification.Name(rawValue: "CartChanged"), object: nil)
}

и в другой функции отовсюду я могу запустить функцию следующим образом:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "CartChanged"), object: nil)
person kaveh naseri    schedule 12.06.2018

Это может быть тривиальным ответом, но иногда самые простые из них являются лучшими:

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = UIColor.myRed
    //THE LINE BELOW EXECUTES JUST FINE
    setupNavBarButtonsWithCartOnLeft()

    fetchProducts(pageSize: numberOfItemsPerSection, pageNumber: numberOfItemsPerSection / 9) // 9 - 1
    setupCollectionView()
}

поскольку ваша функция является расширением UIViewController, и UICollectionViewController наследует ее, она уже доступна там, просто попробуйте, когда я запустил ваше приложение, оно было вызвано. Я поместил оператор печати в вашу функцию, чтобы я мог видеть, когда она была вызвана. Надеюсь, это помогло.

person AD Progress    schedule 09.06.2018