web-dev-qa-db-fra.com

Désactivation de l'interaction de l'utilisateur de la vue actuelle à l'écran

Mon application a de nombreuses vues et leurs contrôleurs respectifs. Maintenant, j'ai un ensemble de classes de modèle avec une logique métier. L'une des classes de modèle (sous-classe de NSObject) est chargée de la gestion de la sécurité. Sa fonction est d'écouter une instruction particulière d'un serveur Web et si un message de désactivation arrive du serveur, désactivez l'interface utilisateur pour toute utilisation ultérieure.

Maintenant, le message 'désactiver' peut arriver à tout moment pendant le fonctionnement de l'application et toute vue peut être visible à l'écran. Comment déterminer quelle vue est visible pour l'utilisateur (à partir de ma classe de modèle) et comment désactiver son interaction?

34
Vin

Vous voulez peut-être que toute l'application ne réagisse pas du tout?

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

utilisez [[UIApplication sharedApplication] endIgnoringInteractionEvents]; pour inverser cette (crédits à nerith)

idem pour Swift:

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

et Swift 3

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

Voici le code pour Swift 3 

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

Légère mise à jour de la syntaxe

2
mightyr

J'ai fait quelque chose de très similaire à cela. Je désactive toute interaction de l'utilisateur en plaçant une vue noire translucide sur tout le reste, ce qui distingue visuellement le fait que l'interface utilisateur entière est désactivée et bloque tous les événements tactiles. D'habitude, j'ajoute simplement cette vue à la classe window après avoir ajouté la vue du contrôleur de vue à la fenêtre, puis je la masque quand elle n'est pas nécessaire.

2
Micah Hainline

Vous pouvez ajouter un délégué dans la classe qui écoute le serveur. Ainsi, lorsqu'il reçoit ce message, il appelle simplement le désactiver, quel que soit son délégué. Quelle que soit la vue affichée pour obtenir le message ainsi que son exécution normale jusqu'à la réception du message. S'il s'agit d'un singleton, définissez simplement la vue en tant que délégué sur viewWillAppear

Une autre option viable consiste à utiliser le centre de notification. Alors, quand votre classe reçoit le message de désactivation, faites simplement

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

et quand vos vues chargent les ajouter pour les écouter 

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

Puis arrêtez d'écouter quand ils ne sont pas nécessaires.

Sous-classer UIViewController et implémenter la fonctionnalité de désactivation, puis sous-classer cette classe dans tous les autres contrôleurs de vue, éliminerait la duplication de code.

1
utahwithak

Je suis un peu hésitant à désactiver les interactions pour l'ensemble de l'application. C'est trop agressif et trop intrusif. Que se passe-t-il lorsque le contrôleur de vue se trouve dans un contrôleur de vue divisé? Ensuite, les deux contrôleurs de vue seront désactivés!

Au lieu de cela, vous pouvez créer un contrôleur de vue de couleur claire et le présenter de manière modale, voir l'exemple ci-dessous pour 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
}

Et maintenant, vous pouvez le présenter depuis votre contrôleur de vue, avant de présenter le HUD:

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

J'espère que cela t'aides!

1
Zorayr

Utilisez le code suivant pour désactiver l'interaction avec l'arrière-plan

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

Maintenant, si vous voulez activer l'utilisation de l'interaction après l'extrait de code

if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) {

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

Voici le code pour Swift 2.2 iOS 9.3

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

Utilisez-le fréquemment, travaillez comme un champion pour moi, très utile pour une vue avec de nombreuses IBActions qui font des appels API et vous ne voulez pas faire un autre appel en attendant la première réponse

0
H.Yuu