将方法委托给UItableViewCell Swift

时间:2017-11-02 15:35:43

标签: ios swift uitableview delegates

我在UItableView表单中有一个社交网络Feed,它有一个单元格。现在每个单元格都有一个图像,当偶数被触发时它会动画。现在,此事件以字符串的形式出现,将在每个单元格中触发。事件的选项在另一个类(NSObject类型)中定义。

我的问题: 我在表视图中构造了一个协议委托方法,只要为每个单元触发事件,就会调用该方法。然后,我在UITableViewCell类中定义了这个函数,因为我的图像将是动画的。 一切都运行良好,但我无法弄清楚如何将TableView类的委托分配给单元类。我的意思是,如何在cellView类中使用UITableView.delegate = self。我尝试过使用静态变量,但它不起作用。

我一直在玩这些协议已经有一段时间但是真的无法找到解决方案。

我希望我很清楚。如果没有,我会在评论中提供一个例子。对不起,这是一个保密项目,我无法透露所有细节。

3 个答案:

答案 0 :(得分:2)

If I correctly understood your question, maybe this could help:

class ViewController: UIViewController, YourCustomTableDelegate {

@IBOutlet weak var tableView: YourCustomTableView!  

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.customTableDelegate = self
    }


    // table delegate method
    func shouldAnimateCell(at indexPath: IndexPath) {
       if let cell = tableView.cellForRow(at: indexPath) {
           cell.animate(...)
       }    
    }
}

答案 1 :(得分:2)

尝试这样的事情:

定义您的委托协议:

protocol CustomCellDelegate: class {
    func animationStarted()
    func animationFinished()
}

定义您的CustomCell。定义弱委托引用非常重要,因此您的类不会互相保留。

class CustomCell: UITableViewCell {
    // Don't unwrap in case the cell is enqueued!
    weak var delegate: CustomCellDelegate?

    /* Some initialization of the cell */

    func performAnimation() {
        delegate?.animationStarted()
        UIView.animate(withDuration: 0.5, animations: {
            /* Do some cool animation */
        }) { finished in
            self.delegate?.animationFinished()
        }
    }
}

定义视图控制器。在tableView:cellForRowAt内分配代表。

class ViewController: UITableViewDelegate, UITableViewDataSource {

    /* Some view controller customization */

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: CustomCell.self)) as? CustomCell
        cell.delegate = self
        cell.performAnimation()
        return cell
    }
}

答案 2 :(得分:2)

如果我理解正确,您是否正在尝试使每个单元符合属于其UITableView的协议?如果是这种情况,那么就无法做到这一点。委托设计模式是一对一的关系,即只有一个UITableViewCells能够符合UITableView的委托。

  

委托是一种简单而强大的模式,其中程序中的一个对象代表另一个对象或与另一个对象协同工作。委托对象保持对另一个对象(委托)的引用,并在适当的时间向其发送消息。该消息通知委托委托对象即将处理或刚刚处理的事件。委托可以通过更新应用程序中自身或其他对象的外观或状态来响应消息,并且在某些情况下,它可以返回影响即将发生的事件处理方式的值。委托的主要价值在于它允许您轻松地在一个中心对象中自定义多个对象的行为。

来自Apple Docs

的引用

我建议您的UITableViewCell应该在触发指定事件时调用块(Objective-C)或闭包(Swift)以实现您正在寻找的内容。在tableView:cellForRowAtIndexPath函数中设置此闭包。

示例

<强> TableViewController

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
  {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCellID", for: indexPath) as! MyTableViewCell
    cell.eventClosure = {
     //Do something once the event has been triggered.
    }
    return cell
  }

<强> TableViewCell

func eventTriggered()
{
  //Call the closure now we have a triggered event.
  eventClosure()
}