2009-03-03 16 views
14

Bir görüntüyü desen olarak çizmek için NSView alt sınıfını oluşturdum:Özel bir NSView’i bağlama: Bir IBPlugin oluşturmayı mı gerektiriyor?

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

@end 

Bağlamaları açığa çıkarmak için aşağıdakileri uyguladık:

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

Ne yazık ki, image bağlaması görünmüyor Arayüz Oluşturucu.

Arabirim Oluşturucu'daki bağlamaları açığa çıkarmak için gerçekten IBPlugin oluşturmak zorunda mıyım? Bu, yeniden kullanmayı planlamamı özel bir görünüm için çok fazla zor görünüyor.

cevap

14

Cevap: Hayır, (kodda bunu yaparak) bir IB eklenti olmadan özel bir görünüm bağlayabilir.
Soru gövdesine soru sor: Evet, IB'deki bağlamayı göstermek için IB eklentisine ihtiyacınız var.

Arabirim Oluşturucu'ya koymadığınız sürece, kodunuz Arabirim Oluşturucu'nun içinde çalışmaz ve bu kodunuz exposeBinding: kodunuzdur. Bu nedenle, bunu bir Arayüz Oluşturucu'ya koymanız gerekir. Bu, IB eklentisi yazmak anlamına gelir. Ayrıca, IB eklentileri eski IB paletleriyle aynı değildir. Eklentiler IB 3 gerektirir ve oluşturmak çok daha kolaydır. Paletler IB 2 gerektirir ve yaratmak için acı vericiydi.

+0

Xcode 6 ile devletin ne olduğunu bilen var mı ..? – Jay

+0

@Jay: Bindings için bunun değiştiğini düşünmüyorum: Yeni denetlenebilir özellikler yaratabilirsiniz, ancak AINDIK Bindings olarak görünmeyeceklerdir. Yine de yanılıyor olabilirim - Xcode 6'ya ve sonraya özel yeni bir soru sormak isteyebilirsiniz. –

2

Hayır,

bind:toObject:withKeyPath:options:

senin programlı bağlama kurmak için yöntemini kullanabilirsiniz. Bağlayıcıların Arayüz Oluşturucu'da görünmesini sağlamak için bir IB paleti oluşturmanız gerektiğine inanıyorum, ama yeniden kullanmak niyetinde olmadığım bir kerelik sınıf için hiç rahatsız olmadım.

+0

Programatik olarak bağlanabileceğimi biliyorum, ancak bu sefer IB'de gerçekten yapmam gerekiyor. Her neyse, gerçekten cevabın için teşekkürler, Alex. –

2

Bağlamaları elle yapmayı başarabilirseniz, kendinize çok zaman kazandıracaksınız. Özel IB paletleri oluşturmak, birkaç satırlık manuel ciltleme koduna kıyasla çok fazla iş. Ancak, ihtiyaçlarınız özel bir IB paleti gerektiriyorsa, NSView alt sınıfının kodlama gerektireceği şeyi gözden geçirerek başlayacağım. Ben son birkaç yıl içinde onu çok kullandım

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

, benim özel IB paleti nesnelerle ve bağlanma sorunları ile çok yardımcı oldu: aramaya başlamak için harika bir yer bağlantılarındaki Crawford'un sitesidir genel. Sitesinde, özel NSView'ları özel bağlantılarla özel olarak ayrıntılandıran bir örnek var.

Dikkat edilmesi gereken başka bir nokta, özel görünümünüzün Arayüz Oluşturucu ortamında da çalışması gerektiğidir. Özel NSView nesnesindeki bağlama kodunuzda yer alması gereken birkaç küçük düzeltme vardır, böylece Arabirim Oluşturucu'da düzgün şekilde çalışıp bağlanır. Bu detaylar da Crawford'un sitesinde belirtilmiştir: başlığa

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

12

Denetleyici nesnesini farklı, standart bir ciltleme (örneğin, toolTip) kullanarak görüntüleme nesnesine bağladım, ardından bir metin düzenleyicisi kullanarak XIB dosyasını düzenledim ve XML'i el ile değiştirdim.

Bundan sonra, ciltleme doğru şekilde çalışıyor ve hatta önyükleme yapmak için doğru şekilde Arabirim Oluşturucusu'nda görünüyor!

+1

Bunu kendim yaptım çünkü IB Eklentisi yapmak istemedim. 1! –

+0

Xcode 4 IB eklentileri için destek aldığından, uygulama kodunuzda bunu yapmak istemiyorsanız en iyi seçenek budur. 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

Harika bir çözüm! Beklediğimden çok daha kolay, ve bir kere çektikten sonra, IB'de mükemmel görünüyor. Teşekkür ederim! – andyvn22