检测 UITableView HeaderView 中 UISegmentedControl 的变化

Detect Change in UISegmentedControl inside UITableView HeaderView

我正在尝试根据我的 UITableView header 中 UISegmentedControlselectedSegmentIndex 来控制我的 UITableView。本质上,我希望这个 UISegmentedControl 像 Twitter 的 'Me' 选项卡一样工作。我在 UITableView header 中有 UISegmentedControl 并且使用此方法将其出队:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let cell = tableView.dequeueReusableCell(withIdentifier: "sectionDetailsHeaderView") as! SectionDetailsHeaderTableViewCell
    return cell
}

我有一个连接到 SectionDetailsHeaderTableViewCell 的 UISegmentedControl 插座,但我不知道如何检测 UISegmentedControl 中的变化。我想在每次值更改时设置一个变量 var segmentedControlValue = Int()selectedSegmentIndex 并在值更改时调用函数 func chooseDataToDisplay() {} 。我该怎么做?

segmentedControl.addTarget(self, action: "chooseDataToDisplay:", forControlEvents: .ValueChanged)

其中 segmentedControl 是您的 UISegmentedControl。每次值更改时都会调用 func chooseDataToDisplay(segment: UISegmentedControl) {}

参考文献:

https://developer.apple.com/reference/uikit/uisegmentedcontrol

分段控件的行为部分 https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/UISegmentedControl.html#//apple_ref/doc/uid/TP40012857-UISegmentedControl

在@Schomes 的回答和 this post 的帮助下,我终于弄明白了!

1) 将 UISegmentedControl 添加到它自己的 UITableViewCell 中。我建议在 UISegmentedControl 后面添加一个带有白色背景的 UIView 来覆盖整个 UITableViewCell,这样 TableView 单元格就会在 UISegmentedControl.

后面流动

2) 添加您的自定义单元格 class 并将其连接到 UITableViewCell

3) 添加出口,例如 yourSegmentedControl 到您的自定义 UITableViewCell class。不要在自定义 UITableViewCell class 中添加操作。这是在步骤 4 中以编程方式完成的。

4) 在UIViewControllerUITableViewControllerclass中添加下面的代码。

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "yourCellIdentifier") as! yourCustomCellClass
    header.yourSegmentedControl.selectedSegmentIndex = self.segmentedControlValue
    header.yourSegmentedControl.addTarget(self, action: #selector(self.getSegmentValue(sender:)), for: .valueChanged)
    return header
}

self.segmentedControlValue 应在 ViewController class 的顶部声明为 var segmentedControlValue = Int()self.getSegmentValue(sender:) 应声明为:

func getSegmentValue(sender: UISegmentedControl) {
    self.segmentedControlValue = sender.selectedSegmentIndex
}

5) 您还需要添加:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 45
}

这是页眉的高度。在我的例子中,大小是 45

6) 您现在可以在 ViewController 中的任何位置访问 self.segmentedControlValue。当用户点击不同的段时,它将更新。