Domanda

Ho creato una sottoclasse di NSView per disegnare un'immagine come modello:

@interface CePatternView : NSView
{
    NSImage*    image;
    id      observableObjectForImage;
    NSString*   keyPathForImage;
}

@end

Ho implementato quanto segue per esporre i binding:

+ (void)initialize
{
    // Expose the "image" binding to IB.
    [self exposeBinding:@"image"];  
}

- (Class)valueClassForBinding:(NSString *)binding
{
    if([binding isEqualToString:@"image"])
        return [NSImage class];
    return nil; // Unknown binding
}

Sfortunatamente, l'associazione immagine non viene visualizzata in Interface Builder.

Devo davvero creare un IBPlugin per esporre i binding in Interface Builder? Sembra davvero eccessivo per una visualizzazione personalizzata che non ho intenzione di riutilizzare.

È stato utile?

Soluzione

Risposta al titolo: No, puoi associare una vista personalizzata senza un plug-in IB (eseguendolo nel codice).
Risposta alla domanda in questione: Sì, è necessario un plug-in IB per esporre l'associazione in IB.

Il tuo codice non viene eseguito in Interface Builder a meno che tu non lo inserisca in Interface Builder e che il messaggio exposeBinding: sia il tuo codice. Pertanto, è necessario inserirlo in Interface Builder. Ciò significa scrivere un plug-in IB.

Inoltre, i plug-in IB non sono gli stessi delle vecchie tavolozze IB. I plug-in richiedono IB 3 e sono molto più facili da creare. Le tavolozze richiedono IB 2 e sono state dolorose da creare.

Altri suggerimenti

Ho semplicemente associato il mio oggetto controller al mio oggetto vista usando un diverso binding standard (diciamo, toolTip), quindi ho modificato il file XIB usando un editor di testo e modificato manualmente l'XML.

Successivamente, l'associazione funziona correttamente e viene anche visualizzata correttamente in Interface Builder per l'avvio!

No, puoi usare il metodo

bind: ToObject: withKeyPath: opzioni:

per stabilire la tua associazione a livello di codice. Credo che tu debba creare una palette IB per far apparire i binding in Interface Builder, ma per una lezione unica che non intendo riutilizzare, non mi sono mai disturbato.

Se riesci a eseguire manualmente i collegamenti, risparmierai molto tempo. La creazione di palette IB personalizzate richiede molto lavoro rispetto ad alcune righe di codice di rilegatura manuale. Ma, se le tue esigenze richiedono una tavolozza IB personalizzata, vorrei iniziare esaminando ciò che la sottoclasse NSView richiederà, in termini di codifica. Un ottimo posto per iniziare a cercare è il sito web di Crawford sugli attacchi:

http://homepage.mac.com/mmalc/CocoaExamples/controllers.html

L'ho usato molto negli ultimi due anni, mi ha aiutato molto con i miei oggetti di palette IB personalizzati e con problemi di rilegatura in generale. C'è un esempio sul suo sito che descrive in dettaglio i NSView personalizzati con attacchi personalizzati.

Qualcos'altro da notare è che la vista personalizzata dovrà funzionare anche nell'ambiente Interface Builder. Esistono alcune piccole correzioni che devono essere messe in atto nel codice di bind nell'oggetto NSView personalizzato in modo che funzioni e si colleghi correttamente in Interface Builder. Questi dettagli sono anche riportati sul sito di Crawford:

http://homepage.mac.com/mmalc/CocoaExamples/controllers .html # ibBindings

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top