Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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()

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