2012-03-08 8 views
7

En una aplicación OS X, tengo varios campos de texto, botones y otros controles dentro de una vista de desplazamiento. ¿Hay alguna forma de desactivar los elementos dentro de la vista de desplazamiento al mismo tiempo?Cocoa: mejor manera de deshabilitar todos los controles en una vista

Me gustaría evitar llamar al setEnabled: en todos y cada uno de los elementos, por lo que el mantenimiento es más fácil si quiero agregar más controles a la vista de desplazamiento más adelante.

Me gustaría destacar que esto es para una aplicación OS X, por lo que las técnicas que funcionan en iOS no se aplican necesariamente aquí.

+1

puede agregar una categoría a uiview y crear un método que propague la propiedad en la jerarquía. – govi

Respuesta

3

Puede recorrer todo el subviews de la vista de contenido y llamar al setEnabled: en todos ellos. Esto podría romper la vista de desplazamiento al deshabilitar alguna vista interna, por lo tanto, no itere en la propiedad subview de la vista de desplazamiento. Para evitar llamar al setEnabled: en las vistas que no tienen una propiedad habilitada, use respondsToSelector:@selector(setEnabled:) para verificar.

-4

probar este

[scrollView setUserInteractionEnabled:NO]; 
+0

Desafortunadamente, usted hace más que deshabilitar los controles de esta manera: también deshabilita el desplazamiento. Esto puede o no ser aceptable. – lnafziger

+5

userInteractionEnabled no existe en NSViews – pepsi

+0

Lo hace en UIView (que es de lo que UIScrollView hereda). – lnafziger

-2

me gusta hacer esto en el controlador de vista con una propiedad (un BOOL llamados userInteractionEnabled o algo similar) y luego comprobar que en los métodos de delegado apropiadas en el controlador de vista:

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

     return YES; 
} 

Haga esto para cada tipo de control que utilice.

+0

UI ... no son para OS X Y las NSViews no tienen la propiedad userInteractionEnabled – nonolays

+0

@ArnaudLays Si bien es cierto, esto fue solo para fines ilustrativos. Lo que hago es ** crear ** la propiedad (como ya he dicho, ** llamar ** a ** o algo similar **) y verificarlo desde los métodos delegados apropiados (como dije 4-1/2 Hace años, cuando escribí esta respuesta ....) – lnafziger

5

Puede hacer esto fácilmente con encuadernaciones. Debe tener una instancia de su clase de controlador en su XIB para los siguientes pasos, pero la técnica no requiere esto: puede realizar la configuración mediante programación si así lo prefiere.

  1. BOOL añadir un alojamiento a su clase controlador, dicen scrollItemsEnabled
  2. En el panel/IB diseñador de Xcode 4 Abra su XI ter
  3. Para cada controlador que le gustaría activado/desactivado seleccionarlo y en las fijaciones panel del inspector de vincular la propiedad Enabled unión a scrollItemsEnabled de la instancia de clase controlador
  4. Ahora en su código de establecimiento de la propiedad va a activar/desactivar todos los elementos juntos
5

Por el bien del registro, que aquí es una categoría NSView que utilizo en mis aplicaciones Cocoa:
https://github.com/ardalahmet/DisableSubviews

Esto hace que sea fácil de activar/desactivar subvistas a la vez y que también ofrece una gran flexibilidad.
Usted puede hacer este tipo de llamadas:

[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]; 

espero que ayude.

+1

Gracias toneladas, esto es justo lo que estaba buscando. +99 Deseo. +1 debe ser suficiente. –

+0

Me alegro de que haya ayudado a David. ¡Gracias! –

2

Aquí hay una categoría NSView que utilicé en mi proyecto que funciona 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 
Cuestiones relacionadas