UISegmentedControl.noSegment在Xcode 11和iOS 13下停止工作

4
我有两个分段控件叠在一起,每个控件有两个选项,所以搜索字段有一个2x2的筛选选项网格。这样做一直很好用,但我刚刚更新到Xcode 11,当我尝试根据用户选择更新它时,UISegmentedControl.noSegment就停止工作了。但是,在属性观察器中将初始值设置为.noSegment时,它可以工作。 isMomentary设置为false。所有outlet都正确设置。我是否忽略了UISegmentedControl行为的某些更新,还是这是一个错误?
显示新的不正确行为这里
之前可以正常工作的当前代码:
@IBOutlet private weak var segmentedControlOne: UISegmentedControl!

@IBOutlet private weak var segmentedControlTwo: UISegmentedControl! {
    didSet {
        // Start with no segment selected on this control. This works!
        segmentedControlTwo.selectedSegmentIndex = -1
    }
}

@IBAction private func oneIndexChanged(_ sender: UISegmentedControl) {
    //Turn off selection on second control while first is selected
    segmentedControlTwo.selectedSegmentIndex = UISegmentedControl.noSegment

    let i = sender.selectedSegmentIndex
    if i == 0 {
        searchType = .users
    } else {
        searchType = .contributors
    }
}

@IBAction private func twoIndexChanged(_ sender: UISegmentedControl) {
    //Turn off selection on first control while second is selected
    segmentedControlOne.selectedSegmentIndex = UISegmentedControl.noSegment

    let i = sender.selectedSegmentIndex
    if i == 0 {
        searchType = .articles
    } else {
        searchType = .categories
    }
}
1个回答

2
感谢您提出这个问题。我也遇到了同样的问题,所以很高兴得到了一些确认,证明我没有错过什么。
虽然希望苹果能尽快修复这个bug,但我通过重新创建分段来实现了以下解决方法。这个代码示例基于一个带有图像作为分段的UISegmentedControl,当然您也可以针对标题字符串采用同样的方法:
public func resetSegmentedControl(_ control: UISegmentedControl) {
    if #available(iOS 13, *) {
        // workaround: recreate the segments
        let numSegments = control.numberOfSegments
        let segmentImages = (0..<numSegments).compactMap { control.imageForSegment(at: $0) }
        control.removeAllSegments()
        for (index, image) in segmentImages.enumerated() {
            control.insertSegment(with: image, at: index, animated: false)
        }
    } else {
        // for earlier versions of iOS, just reset the selectedSegmentIndex
        control.selectedSegmentIndex = UISegmentedControl.noSegment
    }
}

当拆卸和重新插入片段时会出现轻微闪烁,但对我来说这比破损的状态更可取。

编辑

如下所示,只需要调用setNeedsLayout

control.selectSegmentIndex = .noSegment
control.setNeedsLayout()

4
不需要这么复杂的解决方案,只需调用 setNeedsLayout - matt
我不想重复我的答案,来自 https://dev59.com/I7bna4cB1Zd3GeqPYEbN#58202246 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接