it-swarm.com.ru

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

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

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

34
Vin

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

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

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

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

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

и Свифт 3

UIApplication.shared.beginIgnoringInteractionEvents()
UIApplication.shared.endIgnoringInteractionEvents()
105
Gotschi

Вот код для Swift 3 

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

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

2
mightyr

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

2
Micah Hainline

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

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

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

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

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

Тогда перестаньте слушать, когда они не нужны.

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

1
utahwithak

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

Вместо этого вы можете создать прозрачный контроллер представления и представить его модально, см. Пример ниже для 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
Zorayr

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

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

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

if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) {

    // Start interaction with application
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
1
Jayprakash Dubey

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

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

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

0
H.Yuu