UISegmentedControl 在值更改时不选择



>以前我在表视图部分标题单元格中使用UISegmentedControl时遇到问题,我想在主视图控制器中侦听值更改。

我通过在 tableView:viewForHeaderInSection 方法中使用 UISegmentedControl 上的addTarget解决了这个问题,这很有效。

默认选择第一段,这有效。点击第二个段时,它会使用其他数据重新加载表视图,这是预期行为。但是,仍会选择第一段。这意味着我无法切换回表视图中的原始数据。

请看这个视频,你会看到我想解释什么。

我无法弄清楚我的代码出了什么问题?

/*
 * 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()
    }
}

看不出我做错了什么?

当 tableView 重新加载时,这意味着viewForHeaderInSection也会重新加载。因此,它在重新加载后进入初始阶段。因此,您应该为此选择不同的方法,例如您可以在表视图之外添加分段控件,而不是标题视图或仅重新加载行或单元格等。

例如

[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationLeft];

更新:

装填段,

 NSRange range = NSMakeRange(0, 1);
 NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range];                                     
 [self.tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone];

它将重新加载第一部分。有关更多详细信息,您可以参考此链接

这是客观的 C 代码转换在 swift!!

希望这对:)有所帮助

最新更新