2012-10-17 10 views
7

Sto sottoclassi NSButtonCell per personalizzare il disegno (tema personalizzabile). Mi piacerebbe personalizzare il modo in cui vengono disegnate le caselle di controllo e i pulsanti di opzione.Come scoprire se sono un NSButton con buttonType NSSwitchButton?

Qualcuno sa come rilevare se un pulsante è una casella di controllo o un pulsante di opzione?

C'è solo -setButtonType :, nessun getter, né -showsStateBy né -highlights. Sembra che fornisca valori di ritorno univoci per le caselle di controllo che non si applicano anche ai pulsanti normali con immagini e immagini alternative.

Finora ho trovato due (non molto carina) soluzioni alternative, ma sono il genere di cosa che sarebbe probabilmente ottenere l'applicazione respinto dal MAS:

  1. Usa [auto valueForKey: @ "ButtonType"]. Funziona, ma dal momento che il metodo non è nelle intestazioni, presumo che questo sia qualcosa che Apple non vorrebbe che facessi.

  2. Override -setButtonType: and -initWithCoder: per tenere traccia del tipo di pulsante quando è impostato manualmente o da XIB. Il problema qui è il caso XIB, perché le chiavi utilizzate per salvare il tipo di pulsante su disco non sono documentate. Quindi, di nuovo, utilizzerei l'API privata.

Mi piacerebbe davvero come questo per essere un rimpiazzo dritto per NSButtonCell invece di costringere il codice client per utilizzare una classe ULIThemeSwitchButtonCell separata per le caselle di controllo e una terza per i pulsanti di opzione.

+1

Per quel che vale, '[sé valueForKey: @ "ButtonType"]' non funziona su OS 10.7, genera un'eccezione chiave non definita. – JWWalker

risposta

1

Un pulsante non sa nulla del suo stile.

Dalla documentazione sulla NSButton

Si noti che non esiste un metodo -buttonType. Il metodo set imposta varie proprietà del pulsante che insieme stabiliscono il comportamento del tipo. -

È possibile utilizzare tag: e setTag: (ereditato da NSButton da NSControl) per contrassegnare il pulsante come una casella di controllo o un pulsante di opzione. Se lo fai in modo programmatico, dovresti definire la costante che usi. È anche possibile impostare il tag in Interface Builder, ma solo come valore intero (numero magico).

+0

Quindi immagino che la domanda sarebbe: quale combinazione di proprietà sono impostate che dovrei cercare per identificare in modo univoco che io sia attualmente un checkbox/pulsante radio. In particolare la grafica del pulsante checkbox/radio sarebbe utile, poiché è quello che voglio sostituire con la mia grafica a tema. – uliwitness

+0

È ancora corretto? – Matt

+0

@Matt immagino di si. Almeno, -setButtonType: è l'unico metodo ufficialmente esposto finora. Non è stato fatto una proprietà. – uliwitness

1

In initWithCoder, qui è il mio adattamento della soluzione BGHUDButtonCell.m, aggiornato per Mac OS Sierra:

-(id)initWithCoder:(NSCoder *)aDecoder { 

    if (!(self = [super initWithCoder: aDecoder])) return nil; 

    NSImage *normalImage = [aDecoder decodeObjectForKey:@"NSNormalImage"]; 
    if ([normalImage isKindOfClass:[NSImage class]]) 
    { 
     DLog(@"buttonname %@", [normalImage name]); 
     if ([[normalImage name] isEqualToString:@"NSSwitch"]) 
     bgButtonType = kBGButtonTypeSwitch; 
     else if ([[normalImage name] isEqualToString:@"NSRadioButton"]) 
     bgButtonType = kBGButtonTypeRadio; 
    } 
    else 
    { 
     // Mac OS Sierra update (description has word "checkbox") 
     NSImage *img = [self image]; 
     if (img && [[img description] rangeOfString:@"checkbox"].length) 
     { 
     bgButtonType = kBGButtonTypeSwitch; 
     } 
    } 
} 
+0

Come si può capire dalla rottura dovuta a cambiamenti di Apple in Sierra, questa soluzione non è sicura. Si può rompere in qualsiasi aggiornamento di dot Apple fa a OS X. – uliwitness

+0

Hehe sì e sono sicuro che qualcuno di Apple sta facendo a pezzi. –

Problemi correlati