Swift-自定义 UITableViewCell 委托给 UIViewController 只有一个协议有效

Posted

技术标签:

【中文标题】Swift-自定义 UITableViewCell 委托给 UIViewController 只有一个协议有效【英文标题】:Swift- custom UITableViewCell delegate to UIViewController only one protocol works 【发布时间】:2016-09-14 00:29:33 【问题描述】:

在应用程序中,我有 UIViewController 符合的自定义协议。我有一个自定义的 tableViewCell 类,里面有 UIImageView 和 UITextView 。出队后,我将单元格的委托设置为 UIViewController。但是,只有一种自定义协议会进行回调(imagepicker 协议)。

protocol customProtocol1
    func pickImage(myInt: Int)

protocol customProtocol2
    func protocol2 (myInt: Int)


class controller1: UIViewController, UITableViewDelegate, customProtocol1, customProtocol2  
    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int 
        return 3
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell  
        let cell = tableView.dequeReusableCellWithIdentifier("customCell",    forIndexPath: indexPath) as! CustomTableCellClass
        cell.delegate = self
        return cell
   
    func pickImage ( myInt: Int)
        print("This line prints")
   

   func protocol2 (myInt: Int)
        print ("This line doesn't print")


   

这是 customTableCellClass 的代码:

class CustomTableCellClass: UITableViewCell, UITextFieldDelegate, UITextViewDelegate 
    var imageDelegate: customProtocol1?
    @IBAction func pickImage( sender: AnyObject) 
        imageDelagate?.pickImage(205)
    

    var somethingElseDelegate: customProcotol2?
    @IBActon func clickOnButton( sender: AnyObject) 
        print("this line prints")
        somethingElseDelegate?.protocol2(2)
    

   override func awakeFromNib()
        super.awakeFromNib()
   

我的问题是,为什么第一个协议得到回调而第二个没有?

【问题讨论】:

您的意思是cell.imageDelegate = selfdelegate 来自哪里? 【参考方案1】:

根据我在您的代码中看到的,您只设置了一个委托,将cellForRowAtIndexPath 中的代码更改为

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell  
    let cell = tableView.dequeReusableCellWithIdentifier("customCell",    forIndexPath: indexPath) as! CustomTableCellClass
    cell.imageDelegate = self
    cell.somethingElseDelegate = self
    return cell

【讨论】:

是的,我现在才知道。感谢您的回复! @EugeneTemlock 如果您认为这是正确的答案,请接受我的回答:) 谢谢【参考方案2】:

您的custom cell 有两个委托属性imageDelegatesomethingElseDelegate,但在您的tableView(tableView:cellForRowAtIndexPath:) 实现中,您只分配一个属性。

如果你设置了这两个属性,你的实现应该可以工作。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
 
    let cell = tableView.dequeReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomTableCellClass
    cell.imageDelegate = self
    cell.somethingElseDelegate = self
    return cell

【讨论】:

以上是关于Swift-自定义 UITableViewCell 委托给 UIViewController 只有一个协议有效的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 以编程方式自定义 UITableViewCell

Swift 自定义 UITableViewCell 标签始终为 nil

多个自定义 UITableViewCell 相互覆盖 Swift

Swift 中的自定义 UITableViewCell 注册类

Swift-自定义 UITableViewCell 委托给 UIViewController 只有一个协议有效

FirebaseUi - Swift - 将 UITableViewCell 的值转换为自定义类