Ios 从UITableViewCell到ViewController的按钮操作

Ios 从UITableViewCell到ViewController的按钮操作,ios,iphone,swift,delegates,Ios,Iphone,Swift,Delegates,我正在尝试实现委托方式,以便在从UITableViewCell到ViewController的按钮点击中执行某些操作。以下是我到目前为止的情况- 表格视图单元格: protocol UserCellDelegate : class { func disableUser(cell: UserCell, button: UIButton) } class UserCell : UITableViewCell { @IBOutlet weak var userLabel: UILa

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

表格视图单元格:

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 
    }


}
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")
    }
}
视图控制器:

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 
    }


}
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函数从未被调用。我做错了什么

最好的方法是什么

我曾经提到过,这也是我现在所关注的,但没有运气。
任何帮助都将不胜感激。谢谢

您应该在
cellforrowatinexpath
方法中设置单元格的
委托
。正如@vadian所说,在viewDidLoad中,您不应该使用默认初始值设定项初始化单元格,并且通过这种方式,在
viewDidLoad
中,您的单元格的委托为零


使用init(style:reuseIdentifier)初始化单元格,或者在cell for row方法中设置委托,因为您无论如何都会在该方法中初始化单元格。

您应该在
cellforrowatinexpath
方法中设置单元格的
委托,在viewDidLoad中,您不应使用默认初始值设定项初始化单元格,并且在
viewDidLoad
中,通过这种方式,单元格的委托为零


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

执行此操作时:

let userCell = UserCell()
userCell.delegate = self
您正在设置
userCell
的委托,并且仅设置
userCell
的委托。我确信在表视图中显示的表视图单元格不是
userCell

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

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

let cell = ...
// setting properties of cell using the model
return cell
您只需在返回之前添加此行:

cell.delegate = self

当您这样做时:

let userCell = UserCell()
userCell.delegate = self
您正在设置
userCell
的委托,并且仅设置
userCell
的委托。我确信在表视图中显示的表视图单元格不是
userCell

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

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

let cell = ...
// setting properties of cell using the model
return cell
您只需在返回之前添加此行:

cell.delegate = self

在您的代码中,
UserCell
的行为类似于
UIView
。您忘记将
userCell
添加到当前控制器的视图中。如果要使用
UITableViewCell
,更好的方法是将其与UITableView一起使用。

在代码中
UserCell
的作用类似于
UIView
。您忘记将
userCell
添加到当前控制器的视图中。如果要使用
UITableViewCell
,更好的方法是将其与UITableView一起使用。

看起来您的代理在vieDidLoad中为零。您应该在cellForRow方法中设置delagate。您不能使用默认初始值设定项
()
初始化
UITableViewCell
的实例。您必须调用指定的初始值设定项
init(样式:reuseIdentifier:)
。在Swift中,使用回调闭包比使用委托模式更方便。@TejaNandamuri:这就成功了!我忽略了它是tableViewCell的事实:-(我找不到像func tableView(uTableView:UITableView,cellForRowAt indexPath:indexPath)->UITableViewCell这样的代码{您在哪里实现UITableViewDataSourcelooks,就像您的委托在ViediLoad中为零一样。您应该在cellForRow方法中设置delagate。您不能使用默认初始值设定项
()
初始化
UITableViewCell
的实例。您必须调用指定的初始值设定项
init(样式:reuseIdentifier:)
。在Swift中,使用回调闭包比使用委托模式更方便。@TejaNandamuri:这就成功了!我忽略了它是tableViewCell的事实:-(我找不到像func tableView(uTableView:UITableView,cellForRowAt indexPath:indexPath)->UITableViewCell这样的代码{在哪里实现UITableViewDataSource