2014-12-05 4 views
10

Ho bisogno di sviluppare un nuovo NSControllo personalizzato. Tutte le guide e gli esempi che riesco a trovare (incluso l'articolo Apple's Subclassing NSControl) sono costruiti attorno a NSCell. Ma a partire da 10.10, tutti i messaggi relativi alle celle su NSControl sono stati deprecati.Classi NSControl personalizzate in OS X 10.10

Ho provato a creare una sottoclasse e ad aggiungere al mio progetto tramite una visualizzazione personalizzata in IB, ma non posso ottenere il controllo per accettare il primo risponditore nonostante sia abilitato, impostando rifiuta PrimoRispettore su NO e restituire SI da acceptFirstResponder. E sono sicuro che mi mancano un sacco di funzionalità (notifiche di modifica del valore, ecc.) Che dovrebbero essere lì.

C'è un riferimento più recente in giro che mostra come dovrebbero ora essere sviluppati i controlli? Il mio Google-fu mi sta deludendo se c'è. Grazie!

+0

Hai mai capito? Sto cercando di affrontare la stessa cosa. Grazie. – pizzafilms

+0

No, non l'ho mai fatto, l'ho messo da parte per lavorare su qualcos'altro e non ci sono ancora tornato. – starkos

+0

Puoi mostrare qualche codice? – rocky

risposta

1

Probabilmente il problema era che il controllo non è mai stato effettivamente impostato come primo soccorritore. Semplicemente cliccando su di esso non lo farà automaticamente. Di seguito è riportato un breve esempio che accetta lo stato di primo risponditore (e lo diventa anche in caso di clic) e disegna un anello di messa a fuoco. Assicurati di abilitare il controllo e impostare il suo obiettivo e azione.

class MyControl: NSControl { 


    override var acceptsFirstResponder: Bool { 
     return true 
    } 


    override func becomeFirstResponder() -> Bool { 
     return true 
    } 


    override func mouseDown(with event: NSEvent) { 
     window?.makeFirstResponder(self) 
    } 

    override func mouseUp(with event: NSEvent) { 
     if let action = action { 
      NSApp.sendAction(action, to: target, from: self) 
     } 
    } 


    override func draw(_ dirtyRect: NSRect) { 
     NSColor.white.set() 
     NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill() 

     if window?.firstResponder == self { 
      NSColor.keyboardFocusIndicatorColor.set() 
     } else { 
      NSColor.black.set() 
     } 
     NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).stroke() 
    } 


    override var focusRingMaskBounds: NSRect { 
     return bounds.insetBy(dx: 1, dy: 1) 
    } 


    override func drawFocusRingMask() { 
     NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill() 
    } 

} 
+0

La mia domanda riguardante un riferimento moderno per la sottoclasse di NSControl è ancora valida; se Apple ha rilasciato un articolo aggiornato, non l'ho ancora trovato. Per quanto riguarda il primo interlocutore: ho lasciato quel codice e ho adottato un approccio diverso, ed è stato troppo tempo fa da ricordare. – starkos

+0

Se si esclude NSCell, i controlli di costruzione sono * molto più semplici *. I controlli non sono realmente diversi da qualsiasi altra vista che gestisca gli eventi di input dell'utente. L'unica cosa che in passato li separava era il loro uso di NSCell come meccanismo principale per eventi e display, in modo che funzionassero nelle visualizzazioni di tabelle, ecc. Ora che NSCell è morto, è semplice: basta usare ciò che è disponibile in NSView/NSResponder/NSControl APIs. Non sono sicuro di cosa potrebbe offrire una nuova guida. – seth