UISegmentedControl 在值更改时未选择

Posted

技术标签:

【中文标题】UISegmentedControl 在值更改时未选择【英文标题】:UISegmentedControl not selecting when value changes 【发布时间】:2016-04-27 11:17:06 【问题描述】:

以前我在 tableview 部分标题单元格中遇到了 UISegmentedControl 的问题,我想听听主视图控制器中的值变化。

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

默认选择第一段,这是可行的。当点击第二段时,它会用其他数据重新加载 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()
    

我看不出我做错了什么?

【问题讨论】:

如果您正在重新加载表格视图,它也会重新加载标题视图。所以段控制重新初始化到以前的状态。 感谢@SuryaSubenthiran!这很有意义.. 有什么方法可以只重新加载特定部分吗? 最好使用flag来保存segment的当前状态,并在初始化时使用flag设置segment状态。 由于已经存储了当前段状态,只需在 viewForHeaderInSection 方法中添加“sectionCell.segmentControl.selectedSegmentIndex=self.segmentControlIndex”行即可。 【参考方案1】:

当 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中的转换!!

希望这会有所帮助:)

【讨论】:

这也包括标题视图,对吗?有什么方法可以只重新加载特定部分吗?

以上是关于UISegmentedControl 在值更改时未选择的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 UISegmentedControl 的字体颜色

UISegmentedControl 值更改时如何仅更改文本颜色?

iOS 13 - UISegmentedControl - 如何更改 selectedSegment 的圆角半径?

更改 UISegmentedControl 的选定段

如何在不更改字体大小的情况下快速更改 UISegmentedControl 的字体?

UISegmentedControl 以编程方式更改段数