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

Всплывающее окно раскадровки закрыто, методы делегата не вызываются

У меня есть контроллер представления, который представлен во всплывающем окне с использованием раскадровки.

введите описание изображения здесь

В контроллере представления представления у меня был следующий код:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let svc = segue.destinationViewController as? SettingsViewController {
        svc.popoverPresentationController?.delegate = self
    }
}

Однако оказывается, что представленный контроллер представления, даже несмотря на то, что он отображается как всплывающее окно, имеет modalPresentationStyle '.Modal и, следовательно, nil popoverPresentationController. Странный!

Итак, я обновил код следующим образом:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let svc = segue.destinationViewController as? SettingsViewController {
        svc.modalPresentationStyle = .Popover
        svc.popoverPresentationController?.delegate = self
    }
}

Делегат svc.popoverPresentationController теперь настроен нормально, но если всплывающее окно закрывается пользователем, нажимающим снаружи, ни один из методов делегата UIPopoverPresentationControllerDelegate (например, popoverPresentationControllerShouldDismissPopover не вызывается. Что мне не хватает?


  • Наверное, глупый вопрос, вы уверены, что переход установлен как «Присутствует как всплывающее окно» в раскадровке? 26.01.2016
  • Да, определенно - и он правильно отображается в виде всплывающего окна (и делал это даже до установки svc.modalPresentationStyle = .Popover). Тем не менее, стоит проверить! 26.01.2016
  • Одна вещь странная, там должно быть написано «Представить как Popover», так как просто Popover не рекомендуется использовать, но я не думаю, что проблема в этом ... 27.01.2016
  • Присутствовать как всплывающее окно - это опция, когда включены классы размеров. Без этого это просто Поповер 27.01.2016
  • svc.popoverPresentationController ненулевое значение в то время? В противном случае он молча не установил бы делегата. 28.01.2016
  • Во втором фрагменте кода он не равен нулю. 28.01.2016
  • @AshleyMills: Просто хочу проверить, была ли у вас возможность проверить ответ, приведенный ниже, или вы ищете что-то другое. 30.01.2016

Ответы:


1

В этом случае нет необходимости в делегировании. Если presentingViewController (то, что vc содержит всплывающее окно) просто переопределяет:

Swift 4

override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    print("Dismiss: \(String(describing: self.presentedViewController))")
    super.dismiss(animated: flag, completion: completion)
}

Swift 3

override func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
    // Before calling super get a handle on which controller is being dismissed
    print("Dismiss: \(self.presentedViewController)")
    super.dismissViewControllerAnimated(flag, completion: completion)
}

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

28.01.2016
  • Это единственный ответ, так что получи награду. Хотя почему-то не кажется правильным 04.02.2016
  • @AshleyMills: любопытно, почему ты так не думаешь? Поскольку всплывающие окна, предупреждения и листы действий являются фактическими контейнерами (начиная с iOS 8), а не их собственными независимыми элементами представления (например, окнами), это действительно имеет смысл. Всплывающее окно теперь работает так же, как обычный VC. 04.02.2016
  • Извините, но не в том смысле, что ваш ответ был плохим. Просто я надеялся, что кто-то узнает, почему методы popoverPresentationControllerDelegate не запускаются. И в моем случае всплывающее окно представлено из UIBarButtonItem на панели навигации, поэтому navController нуждается в подклассе для реализации вашего решения. 04.02.2016

  • 2

    Заглянул в ту же проблему, и после прочтения документации я понял, что вам нужно позвонить:

    [self presentViewController:myPopoverViewController animated: YES completion: nil];

    для вызова методов делегата.

    Полный фрагмент выглядит следующим образом и выполняется в моем методе - (void) prepareForSegue: sender:

    // Present the view controller using the popover style.
    myPopoverViewController.modalPresentationStyle = UIModalPresentationPopover;
    [self presentViewController:myPopoverViewController animated: YES completion: nil];
    
    // Get the popover presentation controller and configure it.
    UIPopoverPresentationController *presentationController =
             [myPopoverViewController popoverPresentationController];
    presentationController.permittedArrowDirections =
             UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight;
    presentationController.sourceView = myView;
    presentationController.sourceRect = sourceRect;
    

    https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller

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

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

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

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

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

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

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

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