Nano Hash - криптовалюты, майнинг, программирование

Указание UISegmentedControlNoSegment для selectedSegmentIndex UISegmentedControl не влияет на iOS 13

Я сопровождаю STAControls, которые являются подклассами различных UIControl, одним из которых является 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. 27.09.2019
  • Я сделал это, но другим будет полезно сообщить об этом, а также это даст им представление о том, насколько велика/срочна проблема. Невозможно обойти это, если вы хотите, чтобы сегментированный элемент управления вел себя таким образом для iOS 13.0 (и, возможно, 13.1), вам понадобится этот обходной путь, поскольку, когда они исправят его, он будет выпущен в новой версии iOS. Вы можете использовать мой подкласс UISegmentedControl вместо создания собственного . См. мой ответ, как он реализован. 28.09.2019
  • Спасибо! Я только что сообщил об этом. Надеюсь, скоро исправят... 29.09.2019

Ответы:


1

Решения, данные в других ответах, раздуты. Существует гораздо более простой обходной путь: просто вызовите setNeedsLayout для сегментированного элемента управления.

self.seg.selectedSegmentIndex = UISegmentedControl.noSegment
self.seg.setNeedsLayout()
02.10.2019
  • Это должен быть принятый ответ. Я просто добавил coinSelection.setNeedsLayout(), и моя существующая реализация сработала. 05.10.2019

  • 2

    Удалите сегмент, затем создайте его снова. Вот версия на Swift, которая работает, только если у вас есть текстовые сегменты (не изображения). Предполагается, что у вас есть раскадровка с сегментированным элементом управления и кнопкой.

    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.

    12.09.2019

    3

    Исправлено и добавлен обходной путь в 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];
    }
    

    Проконсультируйтесь по этой ссылке для всего коммита.

    12.09.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..