Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Aktualizacja pola NSTextField z zewnętrznej poklasy NSView po kliknięciu myszką


  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 12 sierpnia 2014 - 19:07

Mam w oknie 2 obiekty: podklase NSView i pole NSTextField w NSView nadpisałem metodę mouseDown aby zaktualizować pole textfield ze współrzednymi po kliknięciu myszką. Wszystko oczywiście działa, ale muszę do utworzonej właściwości podklasy NSView dodać referencję do textfield tak aby była możliwość aktualizacji pola bierzącymi współrzędnymi. Istnieje jakiś inny sposób, tak aby po kliknięciu myszką w CustomView zewnętrzne pole textField zostało automatycznie odświeżone ? ( punkty są pobierane z metody podklasy NSView, tylko kwestia odświeżenia ). Nie chcę stosować NSTimer. Więc jest jakaś alternatywa ?

#2 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

Napisano 12 sierpnia 2014 - 19:36

Oczywiście, że jest inna metoda. Ustaw w kontrolerze tego NSView (a nie na nim, to jest błąd) property, np typu NSString. To property będziesz aktualizował na NSView mouseDown a w swoim NSTextField ustaw obserwatora (binding) do tego property. Pamiętaj tylko aby poinformować obserwatora, że nastąpiła zmiana zawartości property (willChangeValueForKey i didChangeValueForKey)

#3 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 13 sierpnia 2014 - 20:16

Zrobiłem tą wersję z NSNotification, działa choć troszkę inaczej zrobiłem niż opisałeś ale sens ten sam. Ale czy jest jeszcze jakiś alternatywny sposób ? Chodziło mi o odwołanie się z CustomView do window bo tam jest umiejscowione pole nstextfield. Skoro CustomView jest podwidokiem window to może jest jakaś metoda aby mieć bezpośredni dostęp do referencji window i przez to dostać się do pola nstextfield ?

#4 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

Napisano 14 sierpnia 2014 - 09:47

Gdybyś zrobił tak jak napisałem, to nie potrzebowałbyś w ogóle dostępu do tego NSTextField w kodzie, bo wszystko odbywało by się automatycznie (po binding).

#5 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 14 sierpnia 2014 - 18:01

Zmotywowałem się i zrobiłem tak jak napisałeś :P Oczywiście za pierwszym razem nie wyszło, ale intuicja zaprowadziła mnie do celu ;)
A że w sieci żadnego przykładu nie znalazłem, więc podaje rozwiązanie:

1. W naszym CustomView ( podklasa NSView ) tworzymy właściwość typu NSString np. txtValue ( która będzie zbindowana do pola tekstowego w oknie ( window )
2. Klikamy na nasze pole tekstowe w IB, następnie przechodzimy do opcji po prawej stronie ( Show the binding inspektor ) -> Value -> zaznaczyć ptaszkiem: Bind to: ( nasz kontroler u mnie to akurat był App Delegate - w kontrolerze w tym przypadku oczywiście musi być zdefiniowane pole typu NSView )
w polu "Model Key Path" wpisujemy mainView.txtValue - ( gdzie mainView to nasza podklasa NSView z widokiem i wczesniej zadeklarowana właściwość txtValue. Tak więc mamy powiązanie pola tekstowego z właściwością NSString w naszym widoku.
3. W moim przypadku kliknięcie myszką na widok ( mainView ) powoduje aktualizowanie naszego pola tekstowego w window.

Poniżej nadpisana metoda w podklasie po NSView -> mouseDown:(NSEvent *)theEvent w podklasie NSView ( instancja obiektu mainView )

- (void)mouseDown:(NSEvent *)theEvent
{
    [self willChangeValueForKey:@"txtValue"];

    points = [theEvent locationInWindow];
    txtValue = [NSString stringWithFormat:@"x:%f | y:%f", points.x, points.y];
   
    [self didChangeValueForKey:@"txtValue"];
    
}





Użytkownicy przeglądający ten temat: 2

0 użytkowników, 2 gości, 0 anonimowych