【问题标题】:Specifying UISegmentedControlNoSegment to UISegmentedControl's selectedSegmentIndex has no Effect on iOS 13将 UISegmentedControlNoSegment 指定为 UISegmentedControl 的 selectedSegmentIndex 对 iOS 13 没有影响
【发布时间】:2020-01-14 04:59:55
【问题描述】:

我是STAControls 的维护者,它继承了各种UIControls,其中之一是UISegmentedControl。在该项目的示例应用程序中,我有以下代码(可以从上述链接下载):

- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSInteger integer = [textField.text integerValue];
    if (integer < 0 || integer >= self.segmentedControl.numberOfSegments) { this doesn't work
        self.segmentedControl.selectedSegmentIndex = UISegmentedControlNoSegment;
    } else { // this works
        self.segmentedControl.selectedSegmentIndex = integer;
    }
}

在 iOS 13 中,UISegmentedControlNoSegment 分配不受尊重:

在 iOS 12 和之前的 iOS 版本中,这表现得很好:

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 我遇到了同样的问题。您是否向 Apple 提交了错误报告?我宁愿不必实现您的解决方法,因为我不继承 UISegmentedControl。
  • 我做了,但它有助于其他人报告它,并让他们了解问题的严重性/紧迫性。如果您希望分段控件在 iOS 13.0(可能还有 13.1)中以这种方式运行,那么您将需要这种解决方法,因为当他们修补它时,它将在新版本的 iOS 中发布。您可以使用my subclass of UISegmentedControl 而不是自己滚动。请参阅my answer 了解其实施方式。
  • 谢谢!我也刚举报了。希望他们能尽快修复它...

标签: objective-c uisegmentedcontrol ios13


【解决方案1】:

其他答案中给出的解决方案被夸大了。有一个更简单的解决方法:只需在分段控件上调用setNeedsLayout

self.seg.selectedSegmentIndex = UISegmentedControl.noSegment
self.seg.setNeedsLayout()

【讨论】:

  • 这应该是公认的答案。我只是添加了 coinSelection.setNeedsLayout() 并且我的现有实现工作了
【解决方案2】:

已解决并在 STASegmentedControl 中添加了解决方法。我做了以下事情:

- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex {
    if (@available(iOS 13.0, *)) {
        if (selectedSegmentIndex == UISegmentedControlNoSegment && self.selectedSegmentIndex >= 0
            && !self.handlingNoSegment)
        {
            self.handlingNoSegment = YES;
            NSUInteger index = self.selectedSegmentIndex;
            NSString *title = [self titleForSegmentAtIndex:self.selectedSegmentIndex];
            [self removeSegmentAtIndex:self.selectedSegmentIndex animated:NO];
            [self insertSegmentWithTitle:title atIndex:index animated:NO];
        }
        self.handlingNoSegment = NO;
    }
    [super setSelectedSegmentIndex:selectedSegmentIndex];
}

请咨询this link 了解整个提交。

【讨论】:

    【解决方案3】:

    删除段,然后重新创建。这是 Swift 中的一个版本,它仅在您有文本段(而不是图像)时才有效。它假定您有一个带有分段控件和按钮的 Storyboard。

    class ViewController: UIViewController {
        @IBOutlet weak var segmentedControl: UISegmentedControl!
    
        @IBAction func clearSegmentedControl(_ sender: Any) {
            guard segmentedControl.selectedSegmentIndex >= 0 else {
                return
            }
    
            let index = self.segmentedControl.selectedSegmentIndex
            let title = self.segmentedControl.titleForSegment(at: index) ?? ""
    
            self.segmentedControl.removeSegment(at: self.segmentedControl.selectedSegmentIndex, animated: false)
            self.segmentedControl.insertSegment(withTitle: title, at: index, animated: false)
            self.segmentedControl.selectedSegmentIndex = UISegmentedControl.noSegment
        }
    }
    

    在模拟器中,我看不到任何闪烁。删除这样一个选定的段后, selectedSegmentIndex 变为 -2。这有点奇怪,所以我添加了最后一行代码,将其设置为 noSegment 常量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-18
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2014-08-13
      相关资源
      最近更新 更多