2009-03-03 33 views
14

Stworzyłem podklasę NSView narysować obraz jako wzorzec:Powiązanie niestandardowego NSView: Czy wymaga utworzenia IBPlugin?

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

@end 

I wdrożone następujące narażać powiązania:

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

Niestety obraz wiążące nie pojawiają się w konstruktorze interfejsów.

Czy naprawdę muszę utworzyć IBPlugin, aby odsłonić wiązania w programie Interface Builder? To wydaje się być przesadą dla niestandardowego widoku, którego nie planuję ponownie użyć.

Odpowiedz

14

Odpowiedź na tytule: Nie można powiązać niestandardowy widok bez plug-in IB (wykonując go w kodzie).
Odpowiedź na pytanie w treści pytanie: Tak, potrzebujesz wtyczki IB, aby ujawnić powiązanie w IB.

Twój kod nie działa w Konstruktorze interfejsów, chyba że umieścisz go w Kreatorze interfejsów, a wiadomość exposeBinding: to Twój kod. Dlatego musisz umieścić go w Interface Builder. Oznacza to pisanie wtyczki IB.

Ponadto wtyczki IB nie są takie same jak stare palety IB. Wtyczki wymagają IB 3 i są dużo łatwiejsze do stworzenia. Palety wymagają IB 2 i były bolesne w tworzeniu.

+0

Ktoś wie, jaki jest stan z Xcode 6 ..? – Jay

+0

@Jay: W przypadku Wiązania, nie sądzę, aby to się zmieniło: Możesz tworzyć nowe właściwości do kontroli, ale nie będą one wyświetlane jako Wiązania AFAIK. Mogę się mylić, możesz chcieć zadać nowe pytanie specyficzne dla Xcode 6 i późniejszych. –

2

Nie można użyć metody

bind:toObject:withKeyPath:options:

ustalić swoje wiązanie programowo. Uważam, że musisz stworzyć paletę IB, aby powiązania pojawiły się w Konstruktorze interfejsu, ale dla jednorazowej klasy, której nie zamierzam używać, nigdy się nie przejmowałem.

+0

Wiem, że mogę bindować programowo, ale naprawdę muszę to zrobić w IB, tym razem. W każdym razie, dziękuję za odpowiedź, Alex. –

2

Jeśli uda się ręcznie wykonać wiązania, zaoszczędzisz sobie wiele czasu. Tworzenie niestandardowych palet IB to dużo pracy w porównaniu do kilku linii kodu ręcznego wiązania. Ale jeśli twoje potrzeby wymagają niestandardowej palety IB, to zacznę od sprawdzenia, czego będzie wymagała podklasa NSView, pod względem kodowania. To doskonałe miejsce do rozpoczęcia poszukiwań jest strona Crawforda na oprawach:

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

Używałem go wiele w ciągu ostatnich kilku lat, to bardzo pomogło w moich własnych IB obiektów palety i wiążących zagadnień generał. Na jego stronie znajduje się przykład, który szczegółowo opisuje niestandardowe NSView z niestandardowymi powiązaniami.

Należy zwrócić uwagę na to, że widok niestandardowy będzie musiał działać również w środowisku programu Interface Builder. Istnieje kilka drobnych poprawek, które należy wprowadzić w swoim kodzie powiązań w niestandardowym obiekcie NSView, aby działał poprawnie i działał w Konstruktorze interfejsów. Te dane są także zauważyć na miejscu Crawforda:

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

12

Po prostu przywiązałem mój obiekt kontrolny do mojego obiektu widoku, używając innego, standardowego wiązania (powiedzmy, toolTip), a następnie edytowałem plik XIB za pomocą edytora tekstu i ręcznie zmodyfikowałem kod XML.

Po tym, powiązanie działa poprawnie, a nawet pojawia się w Konstruktorze interfejsów poprawnie do rozruchu!

+1

Po prostu zrobiłem to sam, ponieważ nie chciałem używać wtyczki IB. +1! –

+0

Ponieważ Xcode 4 zrzucił obsługę wtyczek IB, wygląda na to, że jest to najlepsza opcja, jeśli nie chcesz tego robić w kodzie aplikacji. 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

Fantastyczne rozwiązanie! O wiele łatwiejsze do edycji, niż się spodziewałem, a kiedy już to zrobisz, wygląda to doskonale w IB. Dziękuję Ci! – andyvn22