我正在尝试实现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这就是我所遵循的,但没有运气。 任何帮助将不胜感激。谢谢!
答案 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。