从 UITableViewCell 子类调用 UIActionSheet

Call UIActionSheet from UITableViewCell subclass

我正在制作一个表格,其中有一堆不同的 UITableViewCells,具有不同的功能,所以我不想让我的 UITableView class 为每个动作都加上颂歌,而是想将每个功能实现到单元格 subclass 本身。

所以,我现在有一个单元格,其中会弹出一个 UIActionSheet,但是当我点击时没有任何反应,即使已经设置了委托。

我的想法是不是错了,换个方式会不会更好?这是一些简单的代码。

import UIKit
class STypeCell: UITableViewCell, UIActionSheetDelegate {

    func chooseType() {
        var sheet: UIActionSheet = UIActionSheet()
        let title: String = "Please choose a course"
        sheet.delegate = self
        sheet.title  = title
        sheet.addButtonWithTitle("Cancel")
        sheet.addButtonWithTitle("A course")
        sheet.addButtonWithTitle("B course")
        sheet.addButtonWithTitle("C course")
        sheet.cancelButtonIndex = 0
        sheet.showInView(self.superview)
    }

    func actionSheet(sheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
        println("this never gets called")
    }

    func actionSheet(actionSheet: UIActionSheet, willDismissWithButtonIndex buttonIndex: Int) {
        println("this never gets called")
    }

    func actionSheet(actionSheet: UIActionSheet, didDismissWithButtonIndex buttonIndex: Int) {
        println("this never gets called")
    }

TableViewCell 不应该在 MVC Patterned framework as iOS is one 中包含那种逻辑。

如果您想重用该逻辑,那么您应该创建一个 TableViewController(或 ViewController),然后将其子类化。 在 TableView 委托方法中,您将调用您的操作。

示例:

class MySuperTableView: UITableViewController, UIActionSheetDelegate {

// [...]

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
  {
      self.chooseType()
  }

  func chooseType() {
      var sheet: UIActionSheet = UIActionSheet()
      let title: String = "Please choose a course"
      sheet.delegate = self
      sheet.title  = title
      sheet.addButtonWithTitle("Cancel")
      sheet.addButtonWithTitle("A course")
      sheet.addButtonWithTitle("B course")
      sheet.addButtonWithTitle("C course")
      sheet.cancelButtonIndex = 0
      sheet.showInView(self.view)
  }

  func actionSheet(sheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
      println("this never gets called")
  }

  func actionSheet(actionSheet: UIActionSheet, willDismissWithButtonIndex buttonIndex: Int) {
      println("this never gets called")
  }

  func actionSheet(actionSheet: UIActionSheet, didDismissWithButtonIndex buttonIndex: Int) {
      println("this never gets called")
  }

// [...]
}

class MyChildTableView: MySuperTableView {

// [...]

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
  {
      super.tableView(tableView, didSelectRowAtIndexPath: indexPath)
  }

// [...]

}

class MyOtherChildTableView: MySuperTableView {

// [...]

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
  {
      super.tableView(tableView, didSelectRowAtIndexPath: indexPath)
  }

// [...]

}

当然,更多的逻辑会有所帮助,比如:点击了什么样的行?我是否有其他可以点击的 TableViewCells,因此我应该检查一下?