10 votes

Cocoa : meilleure façon de désactiver tous les contrôles dans une vue

Dans une application OS X, j'ai plusieurs champs de texte, des boutons et d'autres contrôles à l'intérieur d'une vue défilante. Existe-t-il un moyen de désactiver tous les éléments de la vue défilante en une seule fois ?

J'aimerais éviter d'appeler setEnabled: sur chaque élément, de sorte que la maintenance est plus facile si je veux ajouter plus tard d'autres contrôles à la vue défilante.

Je tiens à souligner qu'il s'agit d'une application OS X. Les techniques qui fonctionnent sous iOS ne s'appliquent donc pas nécessairement ici.

6voto

ardalahmet Points 920

Pour mémoire, voici une catégorie NSView que j'utilise dans mes applications Cocoa :
https://github.com/ardalahmet/DisableSubviews

Il permet d'activer/désactiver facilement les vues secondaires en une seule fois et offre également une grande flexibilité.
Vous pouvez passer de tels appels :

[scrollView disableSubviews:YES];

[self.window.contentView disableSubviews:YES
                                  ofType:[NSTextField class]];

[someView disableSubviews:YES
                   filter:^BOOL (NSView *v) {
                       return [v isKindOfClass:[NSTextField class]] &&
                              (((NSTextField *) v).stringValue.length < 1);
                   }];

[otherView disableSubviews:disable
                  startTag:3
                    endTag:7];

J'espère que cela vous aidera.

5voto

CRD Points 21578

Vous pouvez effectuer ce genre de tâches facilement avec des fixations. Vous devez avoir une instance de votre classe de contrôleur dans votre XIB pour les étapes suivantes, mais la technique ne l'exige pas - vous pouvez faire la configuration de manière programmatique si vous préférez.

  1. Ajouter un BOOL à votre classe de contrôleur, par exemple scrollItemsEnabled
  2. Dans le panneau IB/designer de Xcode 4, ouvrez votre XIB.
  3. Pour chaque contrôleur que vous souhaitez activer/désactiver, sélectionnez-le et, dans le volet des liaisons de l'inspecteur, associez l'attribut Enabled la liaison avec scrollItemsEnabled de l'instance de votre classe de contrôleur
  4. Maintenant, dans votre code, la définition de la propriété activera/désactivera tous les éléments ensemble.

4voto

Mr. Berna Points 7329

Vous pouvez itérer à travers tous les subviews de la vue du contenu, et appeler setEnabled: sur toutes ces personnes. Cela pourrait briser la vue défilante en désactivant une vue interne, donc n'itérez pas sur l'élément subview de la vue défilante elle-même. Pour éviter d'appeler setEnabled: sur les vues qui n'ont pas de propriété enabled, utilisez respondsToSelector:@selector(setEnabled:) pour vérifier.

4voto

tojohere Points 53

Voici une catégorie NSView que j'ai utilisée dans mon projet et qui fonctionne bien.

//Code for NSView+Custom.h
#import <Cocoa/Cocoa.h>
@interface NSView (Custom)
    -(void) setEnabled:(BOOL) isEnabled;
@end

//Code for NSView+Custom.m

#import "NSView+Custom.h"

@implementation NSView (Custom)

-(void) setEnabled:(BOOL) isEnabled{

    for (NSView* subView in self.subviews) {

        if ([subView isKindOfClass:[NSControl class]]) {

            [(NSControl*)subView setEnabled:isEnabled];
        }else  if ([subView isKindOfClass:[NSView class]]) {

            [subView setEnabled:isEnabled];
        }
    }
}

@end

-3voto

lnafziger Points 18241

J'aime faire cela dans le contrôleur de vue avec une propriété (un BOOL appelé userInteractionEnabled ou quelque chose de similaire) et ensuite le vérifier dans les méthodes déléguées appropriées dans le contrôleur de vue :

 - (BOOL)textFieldShouldBeginEditing:(UITextfield *)txtField {
      if (!self.userInteractionEnabled) {
           return NO;
      }
      // Your other logic

      return YES;
 }

Faites-le pour chaque type de contrôle que vous utilisez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X