如何从另一个类调用函数

Posted

技术标签:

【中文标题】如何从另一个类调用函数【英文标题】:How to call a function from another class 【发布时间】:2018-06-09 18:25:17 【问题描述】:

在我的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) wichi 在 helper/extension+UIViewController 中

【问题讨论】:

Calling function from another ViewController in swift的可能重复 您的确切问题标题出现了许多关于堆栈溢出的重复问题。 显示更多关于重置的代码:defaultviewcontroller,也许你在 github 上有它,所以我可以看看并贡献一下 @ADProgress,这是链接:github.com/kavehnaseri/Protino/blob/master/Protino。我想从默认控制器调用的函数是 (setupNavBarButtonsWithCartOnLeft) wichi 在 helper/extension+UIViewController 在下面查看我的答案 我已经在 viewDidLoad 中添加了对该方法的调用,但您可以在需要的任何地方添加它,因为它可以访问 【参考方案1】:

终于找到解决办法了,我应该用NotificationCenter

所以,我在 UIViewController 扩展中创建了一个名为 setupBarButtonMenu 的函数,我想做的只是从 ChildViewController 在 ParentViewController 中调用它。 我像这样在 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)

【讨论】:

【参考方案2】:

这可能是一个微不足道的答案,但有时最简单的答案是最好的:

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 继承了它,所以它可以在那里访问,当我运行你的应用程序时尝试它被调用我已经在你的函数中添加了一个打印语句,以便我可以看到它是什么时候叫。希望这会有所帮助。

【讨论】:

以上是关于如何从另一个类调用函数的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类调用函数

如何从另一个类中的一个类调用 setter 函数?

如何从另一个类调用指向成员的函数? [复制]

如何使用线程从另一个类调用不同的函数

如何从另一个成员函数调用成员函数指针?

如何在 Java 中从另一个构造函数调用一个构造函数?