【问题标题】:How to properly implement a static cell with Swift 3如何使用 Swift 3 正确实现静态单元
【发布时间】:2017-01-15 07:35:26
【问题描述】:

我真的找不到一个教程来告诉我如何构建一个使用静态单元格的应用程序;带有可点击的单元格。基于几个过时的发布和object-c答案,我把一些东西放在一起。我的问题是,当我点击一个单元格时,我得到 staticDemoTableCell is has no member present.

我在 UIViewController 中嵌入了一个表格控制器。对于那个单元格(目前只有一个),我创建了一个类:

class staticDemoTableCell: UITableViewCell, UITableViewDelegate {
  @IBOutlet weak var tableView: UITableView! 

  override func awakeFromNib() {
    [...]
    tableView.delegate = self
  }

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("clicked") // Works when the cell is clicked
    // self.present() do not work. I need to present another viewcontroller when this cell is clicked
  }

}

有些地方不对,因为每个单元格都是一个类?

我真的需要知道我这样做是否正确。我真正想要的更多是这样的。您是否看到过 ie:分组交易星期一:列表,星期二:列表等。每个单元格都可以单击,就像您的 iOS 设备的设置一样。任何指点将不胜感激。

【问题讨论】:

  • 单元格通常不是UITableViewDelegate(因为您有多个单元格,但表格视图只能有一个委托)。通常,视图控制器将是(并且仅当您相应地设置表视图的delegate 时才会如此)。
  • @Rob 谢谢。
  • "有些地方不对,因为每个单元格都是一个类?"如果从下面的答案(以及我在上面的评论)中不清楚,不,您不需要(也不希望,很可能)为单元格设置不同的类。事实上,您根本不需要 UITableViewCell 子类。对于动态单元格来说确实很强大,但是对于静态表来说就完全没必要了。
  • @Rob 想想你 iOS 设备的设置部分(应用程序),那不是静态单元格吗?当你点击一个单元格时,你会得到不同的 VC。请原谅我的问题,我刚开始学习,发现在问这些问题之前很难找到教程。
  • 关于如何从点击静态单元格过渡到下一个场景,如果每个单元格都将您带到不同的场景,那么在 IB 中使用从单元格到各种不同场景的转场会更容易。您可以通过更少的编程获得您的 UI。但是,如果你有十几个静态单元可以将你带到同一个“下一个场景”,那么与其让来自不同单元的十几个 segue 到同一个下一个场景,我会改为对下一个场景有一个 segue,然后让didSelect 以编程方式为所有相关的自定义单元格执行单一的转场。

标签: swift uitableview swift3 tableviewcell


【解决方案1】:

如果表格视图包含静态单元格会容易得多:

  • 在 Interface Builder 中选择表格视图并将 Content 设置为 Static Cells
  • 在控制器类中创建IBOutlets 和IBActions 并将它们连接起来。
  • 不需要实现表格视图数据源方法和子类化单元格。

【讨论】:

  • 嗨。是的,我已设置为静态和分组。 IBOutlets 已连接,但我没有任何 IBAction;没有按钮。一个单元格应该是可点击的,它将我带到 x 视图控制器。怎么样?
  • 我自己从未尝试过,但委托didSelect...(在控制器中实现)不起作用?
  • 是的,行得通。我得到了印刷品。目的是导航到另一个视图控制器。 self.present 不工作。我假设present 只能在 uiviewcontroller 中工作?我知道这里出了点问题。
  • 如果你有一个从包含表视图的视图到另一个视图控制器的 segue,你可以使用 performSegue(withIdentifier...)
  • 静态单元格与其他 UI 元素(标签、按钮等)一样使用。没有数据源方法cellForRow...numberOfRows...
【解决方案2】:

因此您可以执行以下操作。设置表格视图,然后将单元格设置为静态,一旦完成,您需要确保知道您将拥有多少个部分。这取决于您的设计或您想要实现的目标。

然后你可以这样做:

如果您有多个部分,并且第 1 部分有多个单元格。而第 2 节只有一个单元格。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    switch indexPath.section {
    case 1:
        switch indexPath.row {
        case 0:
            // Do something
        case 1:
            // Do something 
        default:
            break
        }
    case 2:
        // Do something
    default:
        break
    }
}

如果您只有一个包含两个单元格的部分,您可以执行以下操作:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    switch indexPath.row {
    case 0:
        // Do something
    case 1:
        // Do something
    default:
        break
    }
}

我希望这有助于解决您的问题。祝你好运

【讨论】:

    【解决方案3】:

    对于不同部分中的行,您可以通过以下示例对 3 个部分执行以下操作。第 1 节有 1 行,第 2 节有 6 行,第 3 节有 3 行:

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 3
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch section {
        case 0:
            return 1
        case 1:
            return 6
        case 2:
            return 3
        default:
            return 0
        }
        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多