Отключение взаимодействия пользователя с текущим представлением на экране
У моего приложения много просмотров и их соответствующих контроллеров. Теперь у меня есть набор классов моделей с бизнес-логикой в них. Один из классов моделей (подкласс NSObject) несет ответственность за управление безопасностью. Он предназначен для прослушивания конкретной инструкции с веб-сервера, и если сообщение "отключить" поступает с сервера, отключите пользовательский интерфейс для дальнейшего использования.
Теперь сообщение "disable" может появиться в любой момент во время работы приложения, и любое изображение может быть видимым на экране. Как определить, какое представление видимо для пользователя (из моего класса модели) и отключить для него взаимодействие пользователя?
Ответы
Ответ 1
Может быть, вы хотите, чтобы все приложение не реагировало вообще?
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
используйте [[UIApplication sharedApplication] endIgnoringInteractionEvents];
, чтобы отменить это
(кредиты для неритов)
то же самое для Swift:
UIApplication.sharedApplication().beginIgnoringInteractionEvents()
UIApplication.sharedApplication().endIgnoringInteractionEvents()
и Swift 3
UIApplication.shared.beginIgnoringInteractionEvents()
UIApplication.shared.endIgnoringInteractionEvents()
Ответ 2
Я сделал что-то очень похожее на это. Я отключу все пользовательские взаимодействия, поставив полупрозрачный черный вид на все остальное, что визуально отличает тот факт, что весь пользовательский интерфейс отключен, и блокирует все события касания. Обычно я просто добавляю это представление в класс окна после того, как я добавил представление диспетчера представлений в окно, а затем просто спрячу его, когда он не понадобится.
Ответ 3
Вы можете добавить делегата в класс, который слушает сервер, и поэтому, когда он получает это сообщение, он просто вызывает запрет на том, кто его делегат. Какой бы вид не показывался, чтобы получить сообщение, а также нормальное выполнение до тех пор, пока сообщение не будет получено. Если это одноэлемент, просто установите представление в качестве делегата на viewWillAppear
.
Другим жизнеспособным вариантом является использование центра уведомлений. Поэтому, когда ваш класс получает сообщение об отключении, просто выполните
[[NSNotificationCenter defaultCenter] postNotificationName:@"disableView" object:nil];
и при загрузке ваших представлений добавьте их для прослушивания
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disableView:) name:@"disableView" object:nil];
Затем прекратите слушать, когда они не нужны.
Подклассификация UIViewController и реализация функции отключения, а затем подклассы этого класса во всех других контроллерах представлений устраняют дублирование кода.
Ответ 4
Я немного не решаюсь отключить взаимодействие для всего приложения - это слишком агрессивно и слишком навязчиво, что происходит, когда контроллер просмотра находится внутри контроллера с раздельным представлением? Тогда оба контроллера просмотра будут отключены!
Вместо этого вы можете создать прозрачный контроллер вида и представить его в виде модально, см. пример ниже для 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)
Надеюсь, это поможет!
Ответ 5
Используйте следующий код для отключения взаимодействия с фоном
//Ignore interaction for background activities
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
Теперь, если вы хотите включить взаимодействие, используйте следующий фрагмент
if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) {
// Start interaction with application
[[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
Ответ 6
Вот код для Swift 2.2 iOS 9.3
UIApplication.sharedApplication().beginIgnoringInteractionEvents()
UIApplication.sharedApplication().endIgnoringInteractionEvents()
Используйте его часто, работайте как champ для меня, очень полезны для просмотра со многими IBActions, которые вызывают вызов API, и вы не хотите делать другой вызов в ожидании первого ответа
Ответ 7
Вот код для Swift 3
UIApplication.shared.beginIgnoringInteractionEvents()
UIApplication.shared.endIgnoringInteractionEvents()
Небольшое обновление синтаксиса