UITableViewCell 和 UIViewController 之间通信的最佳方式
Best way to communicate between UITableViewCell and UIViewController
下面的代码有效,但可能有更好的方法。我的目标是在退出编辑模式时从 UITableCell 调用 UIViewController 函数。
我通过为每个 UITableViewCell 设置一个实例化的 UIViewController 引用然后在 UITableViewCell 状态更改时调用函数 CancelDelete() 来实现这一点。
代码似乎效率低下,因为对于每个 MyCell,我首先将占位符 MyViewContoller 实例化为 public 变量,然后在 UITableView 初始化时将其替换为对 UIViewController 的引用。
有更好的方法吗?
class MyCell : UITableViewCell
{
var previousState : UITableViewCellStateMask = UITableViewCellStateMask.allZeros
// This holds a reference to the parent view controller
// Seems wasteful to instantiate since it gets replaced
var controller:MyViewController = MyViewController()
// This is called when the user aborts edit mode
override func willTransitionToState(state: UITableViewCellStateMask) {
if state & UITableViewCellStateMask.ShowingEditControlMask != nil {
if previousState & UITableViewCellStateMask.ShowingDeleteConfirmationMask != nil {
// send notification to controller
controller.CancelDelete(self)
}
}
previousState = state
}
}
class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Give cell access to this controller
var cell:MyCell = tableView.dequeueReusableCellWithIdentifier("cell") as MyCell
cell.controller = self
cell.tag = indexPath.row
}
// This is called from the table cell
func CancelDelete(cell:MyCell) {
editButtons[cell.tag].hidden = false
}
}
将 controller
的类型更改为 MyViewController!
而不是 MyViewController
。另外,将其设置为默认值 nil
.
controller
的声明应该如下所示:
var controller: MyViewController! = nil
如果您对以感叹号 (!
) 结尾的类型有任何疑问,请查看:
https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html
(在名为 Optionals 的部分)。
下面的代码有效,但可能有更好的方法。我的目标是在退出编辑模式时从 UITableCell 调用 UIViewController 函数。
我通过为每个 UITableViewCell 设置一个实例化的 UIViewController 引用然后在 UITableViewCell 状态更改时调用函数 CancelDelete() 来实现这一点。
代码似乎效率低下,因为对于每个 MyCell,我首先将占位符 MyViewContoller 实例化为 public 变量,然后在 UITableView 初始化时将其替换为对 UIViewController 的引用。
有更好的方法吗?
class MyCell : UITableViewCell
{
var previousState : UITableViewCellStateMask = UITableViewCellStateMask.allZeros
// This holds a reference to the parent view controller
// Seems wasteful to instantiate since it gets replaced
var controller:MyViewController = MyViewController()
// This is called when the user aborts edit mode
override func willTransitionToState(state: UITableViewCellStateMask) {
if state & UITableViewCellStateMask.ShowingEditControlMask != nil {
if previousState & UITableViewCellStateMask.ShowingDeleteConfirmationMask != nil {
// send notification to controller
controller.CancelDelete(self)
}
}
previousState = state
}
}
class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Give cell access to this controller
var cell:MyCell = tableView.dequeueReusableCellWithIdentifier("cell") as MyCell
cell.controller = self
cell.tag = indexPath.row
}
// This is called from the table cell
func CancelDelete(cell:MyCell) {
editButtons[cell.tag].hidden = false
}
}
将 controller
的类型更改为 MyViewController!
而不是 MyViewController
。另外,将其设置为默认值 nil
.
controller
的声明应该如下所示:
var controller: MyViewController! = nil
如果您对以感叹号 (!
) 结尾的类型有任何疑问,请查看:
https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html
(在名为 Optionals 的部分)。