以前我遇到过在tableview部分标题单元格中有UISegmentedControl的问题,我想在主视图控制器中监听值的变化。
我在addTarget
方法的UISegmentedControl上使用tableView:viewForHeaderInSection
解决了这个问题,这很有效。
默认选择第一个段,这是有效的。当点击第二个段时,它会使用其他数据重新加载tableview,这是预期的行为。但是,仍然会选择第一个细分。这意味着我无法切换回表格视图中的原始数据。
Please see this video你会看到我想要解释的内容。
我无法弄清楚我的代码有什么问题?
/*
* Main View Controller
*/
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 0 {
return nil
}
let sectionCell = tableView.dequeueReusableCellWithIdentifier("SegmentCell") as! SegmentTableViewCell
// Add event for the UISegmentedControl
sectionCell.segmentControl.addTarget(self, action: #selector(self.handleSegmentControlEvent), forControlEvents: .ValueChanged)
return sectionCell
}
func handleSegmentControlEvent(sender: UISegmentedControl) {
self.segmentControlIndex = sender.selectedSegmentIndex
switch (sender.selectedSegmentIndex) {
case 0:
if latestTableData.count == 0 {
loadItems("latest")
} else {
tableView.reloadData()
}
break
case 1:
if closestTableData.count == 0 {
loadItems("closest")
} else {
tableView.reloadData()
}
break;
default:
break
}
}
/*
* Segment table view cell
*/
class SegmentTableViewCell: UITableViewCell {
@IBOutlet weak var segmentControl: UISegmentedControl!
override func awakeFromNib() {
super.awakeFromNib()
}
}
我无法看到我做错了什么?
答案 0 :(得分:2)
当tableView重新加载时,意味着viewForHeaderInSection
也重新加载。因此,它在重新加载后进入初始阶段。所以你应该为它选择不同的方法,就像你可以在tableview之外添加分段控件而不是headerview或仅重新加载行或单元格等。
例如,
[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationLeft];
更新:
重装部分,
NSRange range = NSMakeRange(0, 1);
NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range];
[self.tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone];
它将重新加载第一部分。有关详细信息,请参阅this link
它是客观的c代码转换为swift !!
希望这会有所帮助:)