Swift: UISegmentedControl последний индекс не выбран - PullRequest
1 голос
/ 15 октября 2019

Я должен выбрать UISegmentedControl индекс программно на viewWillAppear().

switch shirtSize {
    case ProfilingPreferredShirtSize.xs.rawValue:
        shirtSizeSegmentedControl.selectedSegmentIndex = 0
    case ProfilingPreferredShirtSize.s.rawValue:
        shirtSizeSegmentedControl.selectedSegmentIndex = 1
    case ProfilingPreferredShirtSize.m.rawValue:
        shirtSizeSegmentedControl.selectedSegmentIndex = 2
    case ProfilingPreferredShirtSize.l.rawValue:
        shirtSizeSegmentedControl.selectedSegmentIndex = 3
    case ProfilingPreferredShirtSize.xl.rawValue:
        shirtSizeSegmentedControl.selectedSegmentIndex = 4
    default:
        break
}

Когда выбран последний индекс (4), соответствующий сегмент не выбирается графически. Когда я вручную нажимаю на последний сегмент, он становится выбранным, но обратный вызов valueChange не вызывается. Это означает, что selectedSegmentIndex уже был установлен, и это просто графическая ошибка. Что я могу сделать? Для всех остальных значений (0-3) это прекрасно работает.

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

Просто попробуйте обновить макет:

setNeedsLayout();
0 голосов
/ 17 октября 2019

Использовать мгновенное свойство UISegmentControl.

Попробуйте выполнить следующее -

    switch shirtSize {
      case ProfilingPreferredShirtSize.xs.rawValue:
           shirtSizeSegmentedControl.selectedSegmentIndex = 0
      case ProfilingPreferredShirtSize.s.rawValue:
           shirtSizeSegmentedControl.selectedSegmentIndex = 1
      case ProfilingPreferredShirtSize.m.rawValue:
           shirtSizeSegmentedControl.selectedSegmentIndex = 2
      case ProfilingPreferredShirtSize.l.rawValue:
           shirtSizeSegmentedControl.selectedSegmentIndex = 3
      case ProfilingPreferredShirtSize.xl.rawValue:
           shirtSizeSegmentedControl.momentary = true
           shirtSizeSegmentedControl.selectedSegmentIndex = 4
           shirtSizeSegmentedControl.momentary = false
      default:
           break
}
0 голосов
/ 15 октября 2019

Можете ли вы попробовать с:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    perform(#selector(switchShirtSizeSegment(shirtSize:)), with: nil, afterDelay: 0.0)
}

@objc func switchShirtSizeSegment(shirtSize: Int) {
    switch shirtSize {
        case ProfilingPreferredShirtSize.xs.rawValue:
            shirtSizeSegmentedControl.selectedSegmentIndex = 0
        case ProfilingPreferredShirtSize.s.rawValue:
            shirtSizeSegmentedControl.selectedSegmentIndex = 1
        case ProfilingPreferredShirtSize.m.rawValue:
            shirtSizeSegmentedControl.selectedSegmentIndex = 2
        case ProfilingPreferredShirtSize.l.rawValue:
            shirtSizeSegmentedControl.selectedSegmentIndex = 3
        case ProfilingPreferredShirtSize.xl.rawValue:
            shirtSizeSegmentedControl.selectedSegmentIndex = 4
        default:
            break
    }
}
...