2009-04-10 4 views
7

Próbuję zrozumieć, jak trudno jest użyć NSPopUpButton. Jest to zdecydowanie najtrudniejszy element użytkownika do programowania w Cocoa (przynajmniej tak daleko, jak go znajduję).NSPopUpButton, Wiązania i skrócenie czasu życia

Sprawa użycie Mam na myśli to, co następuje:

  • Mam klasy o nazwie Port, który reprezentuje port szeregowy.
  • Wśród atrybutów jest pole nazwy.
  • W polu NSPopUpButton chcę wyświetlić pole nazwy dla każdego portu.
  • Gdy użytkownik wybierze określony port, zostanie on oznaczony w wyskakującym okienku za pomocą haczyka zgodnie z oczekiwaniami.
  • Po naciśnięciu przez użytkownika przycisku łączenia mogę ustalić, który z portów został wybrany.
  • Chciałbym osiągnąć to za pomocą wiązań, jak myślę, gdy już się nad tym rozprawię, będzie to bardziej eleganckie rozwiązanie.

Dlatego w moim AppController.h Oczekuję dwa atrybuty, które przypuszczalnie mogę tworzyć jako właściwości oraz synteza:

NSMutableArray *allPorts; 
Port *currentlySelectedPort; 

i jedna akcja w moim .m:

-(void)didSelectConnect:(id)sender{ 
    NSLog(@"Selected port name is:%@",[currentlySelectedPort name]); 
} 

w Port.h Mam

NSString *name; 
NSString *baudRate; 
... etc ... 

I ha ve stworzyłem prosty projekt, który zawiera tylko pop up (i etykietę) i po różnych artykułach, udało mi się wypełnić NSMutableArray elementami, które następnie wykorzystam ArrayController do wyświetlania wartości, a następnie przy wyborze ustaw wartość etykiety (za pomocą kontrolera obiektu). Jednak o ile jest to sprytnie, nie pasuje do przypadku użycia, który próbuję zaimplementować. Więc zwracam się tutaj o pomoc

M

+0

Być może warto rozważyć rozpoczęcie bez używania powiązań. Napiszesz więcej kodu, ale musisz zrozumieć, że kod (i wszystkie podstawowe technologie kryjące się za powiązaniami, takie jak KVO), zanim naprawdę możesz sprawić, że wiązania będą działały dla ciebie w złożonych przykładach. –

Odpowiedz

11

OK, wiązania z NSPopUpButton są nieco skomplikowane, ponieważ istnieją dwie rzeczy, których potrzebuje: wiążąca dla wartości i wiążące dla których wybrano jedną z tych wartości . Jeszcze bardziej skomplikowane jest to, że istnieje kilka całkowicie uzasadnionych sposobów na to, a wybór, który wybierzesz, zależy całkowicie od struktury twojego programu i do pewnego stopnia osobistych preferencji.

Aby uzyskać listę wartości, należy powiązać właściwość content. W twoim przypadku prawdopodobnie powiążesz to z kluczem arrangedObjects z NSArrayController. W tej konfiguracji każda pozycja menu reprezentuje jeden obiekt. Domyślnie tytułem pozycji menu jest ciąg zwracany przez wywołanie description dla każdego elementu w tablicy. Jeśli chcesz użyć innej właściwości tytułu menu, możesz także powiązać tablicę contentValues. Wystarczy upewnić się, że klucz ścieżka określona dla contentValues ma kluczową ścieżkę content jako jego prefiksu (na przykład można użyć arrangedObjects dla content i arrangedObjects.name dla contentValues)

To daje pozycje menu, które reprezentują obiektów. To, czego potrzebujesz dalej, to jakiś sposób identyfikacji wybranego. Dostępne są trzy różne powiązania: selectedIndex, selectedObject i selectedValue.Reprezentują one odpowiednio indeks obiektu tablicy, który użytkownik wybrał, wartość obiektu (jeden z obiektów w tablicy content), oraz tytuł napisu wybranego elementu (jeden z obiektów w tablicy contentValues, jeśli jesteś związany ta własność).

W twoim przypadku możesz związać selectedObject z właściwością selectedSerialPort w klasie kontrolera. Kiedy użytkownik kliknie przycisk "Połącz", musisz tylko odwołać się do właściwości selectedSerialPort.

6

Możesz pobrać sample Xcode project here. To trzyma się tak blisko, jak tylko mogłem dostać się do twojego opisu.

Ważne jest, aby spojrzeć na połączenia między kontrolerem macierzy, AppController i wyskakującym okienkiem.

Po prostu pokazuje to, co powiedział Alex.

+0

Abizem, z chęcią przyjmiemy odpowiedzi jako Twój kod, z wyjaśnieniem zadziałało! – Clokey

+0

Co zrobić, jeśli nie zainicjujesz tablicy allPorts do momentu przebudzenia FromNib? W jaki sposób powiesz NSPopUpButton, aby ponownie załadował wartości? – johnboiles

Powiązane problemy