2015-05-27 27 views
16

Mam prostą aplikację do czatu z NSTableView opartym na widoku tekstowym, jak widać na poniższym obrazku. enter image description here Każda wiadomość zawiera instancję klasy NSTextView, której wysokość pasuje do całego tekstu.Sposób wywoływania metody autoscroll NSScrollView programowo

Wszystko, czego potrzebuję, to uruchomić NSScrollView (którego instancja NSTableView jest otoczona) autoscrolling, podczas gdy użytkownik zaznacza mysz wystarczająco przeciągającą tekst. Niestety autosportowanie się nie pojawia. W przypadku przeciągania gdzieś poza widoki tekstowe wszystkie kończą się pomyślnie.

Próbowałem zadzwonić autoscroll: -method bezpośrednio po prostu wcisnąć NSEvent -instance z NSTextView -subclass "myszy przeciągać" -event (jak w przykładzie z this article):

- (void)mouseDragged:(NSEvent *)event 
{ 
    [self.scrollView autoscroll:event]; 
} 

Jak już overrode wszystko zdarzenia myszy i zaimplementowane wszystkie wybieranie tekstu, ta metoda często wywołuje. Ale autoscrolling nie działa.

UPDATE

zorientowali się, że przed wywołaniem -autoscroll: -method musi istnieć -mouseDown: z tego samego obiektu. Ale łamie mój mechanizm wyboru tekstu. Chodzi o to, że nawet nie będąc pierwszym ratownikiem, nie może być nic innego, jak tylko metoda.

+0

Jeśli mówisz, że z NSTableView wewnątrz NSScrollView i wiersze NSTableView są wieloliniowe, a podczas zaznaczania tekstu w komórce i przeciągania w dół poniżej dolnej części widoku przewijania, nie przewija? Jeśli tak, ta funkcja jest zapewniona automatycznie przez NSScrollView i nic więcej nie jest potrzebne do przewijania, aby wystąpił podczas wybierania. Aby przetestować, utworzyłem nowy projekt, dodałem NSScrollView (NSTableView), ustawiłem wysokość wiersza większą niż widok przewijania i wypełniłem widok tabeli. Kliknięcie tekstu, a następnie zaznaczenie w dolnej części przewijania. Przewija się automatycznie. – Jay

+0

@Jay muszę uruchomić NSTableView przewijanie autoscrolling widok, a nie widok tekstu jeden (widok tekstowy ma wysokość wystarczającą do dopasowania tekstu). – Astoria

+0

Nie jestem pewien, o co pytasz. Zakładając, że zaimportujesz NSTableView z Biblioteki obiektów do okna w Xcode, NSTableView zostanie zamknięty przez NSScrollview.Jeśli próbujesz wybrać tekst w wierszu w widoku tabeli, klikając myszą w wierszu, w którym znajduje się tekst i przeciągając w dół (jak widać na ekranie, otaczający NScrollView obsługuje to automatycznie i przewinie w górę, aby możesz kontynuować zaznaczanie tekstu – Jay

Odpowiedz

2

Zwykle widok tekstowy znajduje się w osobnym widoku przewijania. Nawet jeśli jest wystarczająco duży, aby pokazać cały tekst bez przewijania, nadal istnieje. Wywołanie -autoscroll: na czymkolwiek w tym widoku przewijania (ewentualnie włączając sam widok przewijania?) Będzie po prostu próbowało przewijać widok przewijania, a nie widok przewijania, który zawiera widok tabeli.

Spróbuj zadzwonić pod numer -autoscroll: w widoku znajdującym się wyżej w hierarchii. Albo self.scrollView.superview, widok komórki tabeli lub widok tabeli.

Należy jednak pamiętać, że widok przewijania widoku tabeli będzie przewijany nawet po pełnym wyświetleniu widoku komórki zawierającego widok tekstowy. W rzeczywistości może nadal przewijać go tak daleko, że jest poza ekranem w przeciwnym kierunku. Zasadniczo nie wie, że próbujesz wybrać w widoku tekstowym, aby nie przestać, gdy zaznaczenie rozciąga się aż do krawędzi widoku tekstowego.

Innym podejściem może być próba użycia "nagiego" widoku tekstowego bez załączonego widoku przewijania. Nie sądzę, że IB pozwoli ci to zrobić, więc musiałbyś to zrobić programowo. Widoki z wyodrębnionymi tekstami nie działają jednak dobrze z układem automatycznym.

+0

Wywołanie '-autoscroll:' (w widoku tabeli lub jego załączonym widoku przewijania) ze zdarzeniem pobranym z parametru '-mouseDragged:' nie powoduje niczego. Być może powinienem jakoś zmutować 'NSEvent'. – Astoria