2009-03-03 7 views
14

he creado una subclase de NSView para dibujar una imagen como un patrón:Enlazando un NSView personalizado: ¿Exige crear un IBPlugin?

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

@end 

he implementado las siguientes acciones para exponer fijaciones:

+ (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 
} 

Por desgracia, la imagen de unión no aparece en Interface Builder.

¿Realmente tengo que crear un IBPlugin para exponer enlaces en Interface Builder? Eso parece demasiado exagerado para una vista personalizada que no planeo volver a utilizar.

Respuesta

14

respuesta al título: No, puede enlazar una vista personalizada sin un plug-in de IB (haciéndolo de código).
Respuesta a la pregunta en el cuerpo de la pregunta: Sí, necesita un complemento IB para exponer el enlace en IB.

Su código no se ejecuta dentro de Interface Builder a menos que lo coloque en Interface Builder, y ese mensaje es exposeBinding:. Por lo tanto, debe ponerlo en Interface Builder. Eso significa escribir un complemento IB.

Además, los complementos de IB no son los mismos que los de las antiguas paletas de IB. Los complementos requieren IB 3 y son mucho más fáciles de crear. Las paletas requieren IB 2 y fueron dolorosas de crear.

+0

¿Alguien sabe cuál es el estado con Xcode 6 ..? – Jay

+0

@Jay: Para las encuadernaciones, no creo que esto haya cambiado: puede hacer nuevas propiedades inspeccionables, pero no se mostrarán como ataduras AFAIK. Sin embargo, podría estar equivocado; es posible que desee formular una nueva pregunta específica para Xcode 6 y posterior. –

2

No, usted puede utilizar el método

bind:toObject:withKeyPath:options:

para establecer su unión mediante programación. Creo que tienes que crear una paleta IB para que aparezcan los enlaces en Interface Builder, pero para una clase única que no tengo la intención de volver a utilizar, nunca me he molestado.

+0

Sé que puedo unirme programáticamente, pero realmente necesito hacerlo en IB, esta vez. De todos modos, gracias por tu respuesta, Alex. –

2

Si puede hacer las ataduras manualmente, ahorrará mucho tiempo. Crear paletas de IB personalizadas es mucho trabajo en comparación con unas pocas líneas de código de enlace manual. Pero, si sus necesidades requieren una paleta de IB personalizada, comenzaría revisando lo que requerirá la subclase NSView, en cuanto a la codificación. Un gran lugar para empezar a buscar es el sitio web de Crawford en encuadernaciones:

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

lo he usado mucho en los últimos dos años, ha ayudado mucho con mis personalizados IB objetos paleta y con temas relacionados con combinaciones de general. Hay un ejemplo en su sitio que detalla NSView personalizados con enlaces personalizados.

Otra cosa a tener en cuenta, es que su vista personalizada también tendrá que funcionar en el entorno de Interface Builder. Hay algunas soluciones pequeñas que deben implementarse en su código de enlaces en su objeto NSView personalizado para que funcione y se vincule correctamente en el Interface Builder. Estos detalles también se observan en el sitio de Crawford:

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

12

Simplemente até mi objeto controlador a mi objeto de vista usando un enlace diferente, estándar (por ejemplo, información sobre herramientas), luego edité el archivo XIB usando un editor de texto y alteré el XML manualmente.

A partir de entonces, la vinculación funciona correctamente e incluso aparece en Interface Builder correctamente para arrancar!

+1

Lo hice yo mismo, porque no quería hacer un complemento de IB. +1! –

+0

Desde que Xcode 4 dejó de ser compatible con los complementos de IB, parece que esta es la mejor opción si no desea hacerlo en su código de aplicación. http://www.cocoabuilder.com/archive/cocoa/307371-how-does-apple-want-us-to-deal-with-custom-elements-in-xcode-4-with-ibplugins-having-been- killed.html # 307599 –

+0

¡Solución fantástica! Mucho más fácil de editar de lo que esperaba, y una vez que lo logras, aparece perfectamente en IB. ¡Gracias! – andyvn22

Cuestiones relacionadas