【问题标题】:Call function in view controller from UITableViewCell从 UITableViewCell 调用视图控制器中的函数
【发布时间】:2015-03-24 00:11:01
【问题描述】:

我有一个让我发疯的问题,如何从 UITableViewCell 中调用视图控制器中的函数。 - 我在 Swift 中这样做。

所以我有一个视图控制器 - 称为 mainVC 在这个 mainVC 中,我声明了一个 tableView,它在该 tableView 单元格中保存了一个 UITableViewCell(自定义/动态),我想调用一个在 mainVC 中声明的函数。如果我喜欢 self.superview?.myFunc 不起作用。

我希望有人可以帮助我...

【问题讨论】:

    标签: xcode uitableview swift uiviewcontroller ios8


    【解决方案1】:

    不幸的是,这并不容易。 您想要查看的是 NSNotificationCenter 甚至更好: - 代表。 如果你想更好地理解 Delegates,我推荐这个教程:http://www.raywenderlich.com/75289/swift-tutorial-part-3-tuples-protocols-delegates-table-views

    如果您不想阅读所有内容,我会尽力在这里解释。

    假设您有两个视图控制器:mainVC 和 otherVC。

    在otherVC的类定义之上,添加如下代码:

    protocol OtherVCDelegate {
       func cellClicked()
    }
    

    在otherVC的类里面,添加如下属性:

    var delegate: OtherVCDelegate?
    

    在 didSelectRow 中(或执行代码的地方),添加以下代码:

    self.delegate?.cellClicked()
    

    现在,回到 mainVC:通过像这样将 mainVC 添加到类中,使 mainVC 符合这个委托:

    class MainViewController: UIViewController, DetailDelegate {
    }
    

    在 MainViewController 添加委托函数并在其中放置您要执行的函数:

    func cellClicked() {
        println("Cell was clicked")
        myFunc()
    }
    

    您要做的最后一件事是让 MainViewController 成为 OtherViewController 的委托。这必须在您从 mainVC 访问 otherVC 的地方完成。假设它是在 prepareForSegue 中完成的:

    if segue.identifier == "showDetail" {
           (segue.destinationViewController as DetailViewController).delegate = self
        }
    

    一开始有点复杂,但是一旦你掌握了它,那就是在公园里散步。

    【讨论】:

    • 感谢您的快速评论,我接受了答案,尽管它不是我所寻找的 100%。我知道如何使用协议和委托,但据我所知,我不能在 TableViewCell 中设置委托,也不能在 TableViewCell 类中使用 prepareForSegue?我所有的代码都只发生在 1 个 viewController 类和一个 UITableViewCell 类中,所以没有发生转义……对我来说这似乎是棘手的部分……有什么想法吗?
    • 啊,我明白了。好吧,我仍然相信代表是最好的方式。您也可以为 UITableViewCell 设置委托。使用我上面提供的代码,但是将 otherVC 中的所有代码放到你的 UITableViewCell 子类中。然后,在您的 UITableViewCell 子类中,您可以在 touchesBegan 中添加 self.delegate?.cellClicked()。请记住通过在 cellForRow 中传入 cell.delegate = self 来使 mainVC 成为委托。我已经测试过了,它应该可以工作!
    • 另一方面,如果所有这些都发生在同一个视图控制器中,这实际上是没有必要的。您应该能够只使用常规的 didSelectRow 并从那里触发该函数。如果不查看更多代码,很难判断。如果你弄明白了,请告诉我。
    • 再次感谢,是的,我搞定了 :)
    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多