【问题标题】:Button Action from UITableViewCell to ViewController从 UITableViewCell 到 ViewController 的按钮操作
【发布时间】:2016-10-12 15:03:07
【问题描述】:

我正在尝试实现委托方式,以便对从我的 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 
    }


}

视图控制器:

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,这也是我所遵循的,但没有运气。 任何帮助将不胜感激。谢谢!!

【问题讨论】:

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

标签: ios iphone swift delegates


【解决方案1】:

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

要么使用 init(style:reuseIdentifier) 初始化您的单元格,要么在单元格中为 row 方法设置委托,因为无论如何您都将在该方法中初始化单元格。

【讨论】:

    【解决方案2】:

    当你这样做时:

    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
    

    你只需要在return前加上这一行:

    cell.delegate = self
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-05-08
        • 2013-03-13
        • 2015-09-18
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多