将视图控制器中的消息传递给Swift中的类

时间:2017-12-10 19:09:34

标签: ios swift delegates

通过使用委托,我试图将数据从视图控制器传递到将显示正确数量的单元格的TableView类。首先,我需要将数组传递给该类(在此处使用String进行调试)

在我的ViewController中:

protocol GroupBillVCDelegate{
  func passFriendArray(string: String)
}

...
class GroupBillViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
    var delegate:GroupBillVCDelegate? // for delegate passing message

    ...

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if (tableView == self.FriendTableView){
            let friendListCell = tableView.dequeueReusableCell(withIdentifier: "friendListCell") as! CategoryRow

            // transfer friends array to CategoryRow
            self.delegate?.passFriendArray(string: "Hello There")

            return friendListCell
        }
    }
}

在TableViewCell类中:

class CategoryRow: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, GroupBillVCDelegate {

    var s:String = String()

    func passFriendArray(string: String) {
        s = string
        print(string)
    }

...

    // used for horizontal scrolling
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        passFriendArray(string: s)   // message supposed to appear here
        print ("TEST")
        return 10
    }

...

}

我无法设置代理。当我运行时,控制台不显示该消息。为什么没有通过?

1 个答案:

答案 0 :(得分:0)

将代表视为桌面上可以连接到助理办公室的对讲机。

这一行:

var delegate:GroupBillVCDelegate? // for delegate passing message

定义内部通信,但不将其连接到任何内容。如果您按下对讲机上的按钮,则它不会连接任何内容。

代码self.delegate?.passFriendArray(string: "Hello There")

使用“可选链接”向委托发送消息(如果有),如果没有委托,则删除消息。

你缺少的是给代表分配一些东西:

self.delegate = someObjectThatConformsToGroupBillVCDelegateProtocol

代表是一对一的关系。

所有这一切,将表视图单元格视为视图控制器的委托是没有意义的。表视图有多个单元格。哪个单元格应该是视图控制器的委托?为什么那个细胞而不是另一个呢?