Отключение взаимодействия с пользователем текущего представления на экране - PullRequest
35 голосов
/ 24 октября 2011

Мое приложение имеет много просмотров и соответствующих контроллеров.Теперь у меня есть набор классов моделей с бизнес-логикой в ​​них.Один из классов моделей (подкласс NSObject) отвечает за управление безопасностью.Его предназначенная функция - прослушивать определенную инструкцию с веб-сервера, и если с сервера приходит сообщение «отключить», отключите пользовательский интерфейс для дальнейшего использования.

Теперь сообщение «отключить» может появиться в любой моментво время работы приложения и любой вид может быть виден на экране.Как определить, какое представление является видимым для пользователя (из моего класса модели), и отключить для него взаимодействие с пользователем?

Ответы [ 7 ]

107 голосов
/ 24 октября 2011

Может быть, вы хотите, чтобы все приложение вообще не реагировало?

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

используйте [[UIApplication sharedApplication] endIgnoringInteractionEvents];, чтобы вернуть это (кредиты Нериту)

то же самое для Swift:

UIApplication.sharedApplication().beginIgnoringInteractionEvents()
UIApplication.sharedApplication().endIgnoringInteractionEvents()

и Swift 3/4

UIApplication.shared.beginIgnoringInteractionEvents()
UIApplication.shared.endIgnoringInteractionEvents()
3 голосов
/ 04 января 2017

Вот код для Swift 3

UIApplication.shared.beginIgnoringInteractionEvents() 
UIApplication.shared.endIgnoringInteractionEvents()

Небольшое обновление синтаксиса

2 голосов
/ 24 октября 2011

Я сделал нечто очень похожее на это.Я отключаю любое взаимодействие с пользователем, помещая прозрачный черный вид поверх всего остального, что визуально отличает тот факт, что весь пользовательский интерфейс отключен, и блокирует все сенсорные события.Обычно я просто добавляю это представление в класс окна после того, как я добавил представление окна представления в окно, а затем просто скрываю его, когда оно не нужно.

1 голос
/ 15 сентября 2015

Я немного не решаюсь отключить взаимодействия для всего приложения - это слишком агрессивно и слишком навязчиво, что происходит, когда контроллер представления находится внутри контроллера разделенного представления? Тогда оба контроллера вида будут отключены!

Вместо этого вы можете создать контроллер представления прозрачного цвета и представить его модально, см. Пример ниже для Swift 2:

private func TransparentViewController() -> UIViewController {
  let transparentViewController = UIViewController(nibName: nil, bundle: nil)
  transparentViewController.modalPresentationStyle = .OverCurrentContext
  transparentViewController.modalTransitionStyle = .CrossDissolve
  transparentViewController.view.backgroundColor = UIColor.clearColor()
  return transparentViewController
}

И теперь вы можете представить его из контроллера представления, прежде чем представлять HUD:

let transparentViewController = TransparentViewController()
self.presentViewController(transparentViewController, animated:false, completion: nil) 

Надеюсь, это поможет!

1 голос
/ 03 декабря 2013

Используйте следующий код для отключения взаимодействия с фоном

//Ignore interaction for background activities
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

Теперь, если вы хотите включить взаимодействие, используйте следующий фрагмент

if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) {

    // Start interaction with application
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
1 голос
/ 24 октября 2011

Вы можете добавить делегата в класс, который слушает сервер, и поэтому, когда он получает это сообщение, он просто вызывает отключение, кем бы ни был его делегат.Какой бы вид ни отображался, чтобы получить сообщение, а также нормальное выполнение, пока сообщение не будет получено.Если это одноэлементный режим, просто установите представление в качестве делегата на viewWillAppear.

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

[[NSNotificationCenter defaultCenter] postNotificationName:@"disableView" object:nil];

, а когда ваши представления загружаются, добавьте их для прослушивания

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disableView:) name:@"disableView" object:nil];

Затем прекратите прослушивание, когда они не нужны.

Создание подклассов UIViewController и реализация функции отключения, а затем создание подклассов этого класса во всех других контроллерах представления позволит устранить дублирование кода.

0 голосов
/ 02 сентября 2016

Вот код для Swift 2.2 iOS 9.3

UIApplication.sharedApplication().beginIgnoringInteractionEvents()
UIApplication.sharedApplication().endIgnoringInteractionEvents()

Используйте его часто, работайте как чемпион для меня, очень полезно для представления со многими IBActions, которые выполняют вызов API, и вы не хотите делать другойзвонок в ожидании первого ответа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...