从UITableViewCell到ViewController的按钮操作

时间:2016-10-12 15:03:07

标签: ios iphone swift delegates

我正在尝试实现Delegate方式,以便在从UITableViewCell到ViewController的按钮上执行某些操作。以下是我到目前为止的情况 -

TableViewCell:

protocol UserCellDelegate : class {
    func disableUser(cell: UserCell, button: UIButton)
}

class UserCell : UITableViewCell {

    @IBOutlet weak var userLabel: UILabel!
    @IBOutlet weak var userDescription: UILabel!

    @IBOutlet weak var writeOutUser: UIButton!

    weak var delegate: UserCellDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()
        writeOutUser.layer.cornerRadius = 5.0
    }


    @IBAction func disableUserButtonAction(sender: UIButton) {
        delegate?.disableUser(self, button: writeOutUser)  //self here I believe to be the cell 
    }


}

的ViewController:

class UserDetailTableViewController : UIViewController, UserCellDelegate {
    override func viewDidLoad() {
      super.viewDidLoad()
      let userCell = UserCell()
      userCell.delegate = self
    }

    func disableUser(cell: UserCell, button: UIButton) {
      print("VC: User Disabled")
    }
}

问题在于,我的ViewController中的disableUser函数永远不会被调用。我究竟做错了什么?

最好的方法是什么?

我曾提到SO Approved Answer Here这就是我所遵循的,但没有运气。 任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:0)

您应该在delegate方法中设置单元格的cellForRowAtIndexPath。正如@vadian所说,在viewDidLoad中,您不应该使用默认初始化程序初始化您的单元格,并且您的单元格的委托是nil通过这种方式viewDidLoad

使用init(style:reuseIdentifier)初始化您的单元格,或者在行方法的单元格中设置委托,因为您将在该方法中初始化单元格。

答案 1 :(得分:0)

当你这样做时:

let userCell = UserCell()
userCell.delegate = self

您正在设置userCell的委托, userCell的委托。我确定表格视图中显示的表格视图单元格不是 userCell

因此,您应该设置实际要在表视图中显示的单元格的委托,而不是设置userCell的委托。创建要在表格视图中显示的新单元格的最可能位置是tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)方法。

在该方法中,您必须具有以下内容:

let cell = ...
// setting properties of cell using the model
return cell

您只需在返回前添加此行:

cell.delegate = self

答案 2 :(得分:0)

在您的代码LinkedList<Object>中,行为就像UserCell一样。您忘记将UIView添加到当前控制器的视图中。如果您想使用userCell,更好的方法是使用UITableView。