【问题标题】:How can I call a func from another controller class?如何从另一个控制器类调用函数?
【发布时间】:2019-08-20 18:33:36
【问题描述】:

我有两节课。 Class 1(a CollectionViewController) 有一个函数,我需要在 Class 2(a TableviewController) 中调用这个函数。谁能帮我解决这个问题?我像下面那样做了,但它不起作用。

extension MenuController {

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        print("clicked menu item...")
        let sideMenuContorller = HomeController()
        sideMenuContorller.closeSideMenu()

    }
}

【问题讨论】:

标签: swift uicollectionview call func


【解决方案1】:

是的,不要那样做。您编写的代码创建了一个全新的HomeController 实例并尝试调用其closeSideMenu() 方法。那是行不通的。

(打个比方:你想改变汽车收音机的电台。你制造了一辆全新的汽车,在该车的收音机上设置电台,扔掉新车,然后想知道为什么你的汽车收音机没有' t 改变了。)

这两个视图控制器是如何创建的?您需要解释这些视图控制器是如何创建的以及它们是如何相互关联的。

不知何故,您的MenuController 需要对现有 HomeController 的引用。

【讨论】:

  • 不要将代码放入 cmets。缺乏格式使它们不可读。而是编辑您的问题并添加其他代码。
  • 是的,正如我所说,我是 swift 的新手。我想知道我该如何处理这个问题?我怎样才能在两辆车之间架起一座桥?可以发个例子给我吗?
【解决方案2】:

我认为你可以在这里使用一个叫做委托的东西:

    protocol ClickedMenuItemDelegate {
     func userDidPressedMenuItem()
    }

    class MenuController {
     delegate: ClickedMenuItemDelegate?
      override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        delegate?.userDidPressedMenuItem()
       }
    }

    class HomeController: ClickedMenuItemDelegate {
    // where you create an object of type MenuController you first set its delegate property
     menuControllerInstace.delegate = self
     func userDidPressedMenuItem() {
       closeSideMenu()
    }

这个想法是,当您调用 delegate?.userDidPressedMenuItem() 时,在您设置 delegate = self 的类中的 userDidPressedMenuItem() 方法中的代码会被调用 你可以在这里找到更多细节:https://learnappmaking.com/delegation-swift-how-to/https://docs.swift.org/swift-book/LanguageGuide/Protocols.html

【讨论】:

  • Swift 命名约定以大写字母开头的协议命名
猜你喜欢
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多