2015-05-27 17 views
16

aufrufen Ich habe einfache Chat-Anwendung mit Textnachrichten View-based NSTableView, wie Sie auf dem Bild unten sehen können. enter image description here Jede Nachricht enthält eine NSTextView-Instanz mit einer Höhe, die dem gesamten Text entspricht.Wie NSScrollView Autoscroll-Methode programmgesteuert

Alles, was ich brauche, ist NSScrollView (welche NSTableView-Instanz eingeschlossen ist) Autoscrolling zu starten, während der Benutzer den Text auswählt und die Maus weit genug zieht. Leider wird Autoscrolling nicht angezeigt. Im Falle eines Ziehens irgendwo außerhalb der Textansichten sind alle erfolgreich.

Ich habe versucht, indem man einfach autoscroll: -Methode direkt NSEvent -instance von NSTextView -subclass -event (von this article wie in Beispiel) "Maus gezogen" Push anrufen:

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

Wie ich overrode habe alle Mausereignisse und implementiert die gesamte Textauswahl, ruft diese Methode oft auf. Aber das Autoscrolling scheint nicht zu funktionieren.

UPDATE

Ich fand heraus, dass -autoscroll: vor dem Aufruf -Methode dort -mouseDown: des gleichen Objekts sein muss. Aber es bricht meinen Textauswahlmechanismus. Der Punkt sogar nicht als Ersthelfer, es muss nichts als die mouseDown: -Methode sein.

+0

Wenn Sie sagen, dass mit einer NSTableView innerhalb einer NSScrollView und die NSTableView Zeilen sind mehrzeilig, und wenn Sie Text innerhalb einer Zelle auswählen und ziehen Sie unter dem unteren Rand der Bildlaufansicht, es scrollt nicht? Wenn dies der Fall ist, wird diese Funktionalität automatisch von NSScrollView bereitgestellt und es ist nichts anderes erforderlich, damit während der Auswahl ein Bildlauf ausgeführt werden kann. Zum Testen habe ich ein neues Projekt erstellt, eine NSScrollView (NSTableView) hinzugefügt, die Zeilenhöhe größer als die Bildlaufansicht festgelegt und die Tabellenansicht gefüllt. Klicken Sie auf Text und wählen Sie dann den unteren Teil des Bildlaufs aus. Es scrollte automatisch. – Jay

+0

@Jay Ich muss NSTableView scroll view Autoscrolling, nicht die Textansicht starten (die Textansicht hat Höhe genug, um den Text zu passen). – Astoria

+0

Ich bin mir nicht sicher, was Sie fragen. Unter der Annahme, dass Sie ein NSTableView von der Objects Library auf das Fenster in Xcode eindrohen, wird das NSTableView von einer NSScrollview eingeschlossen.Wenn Sie versuchen, den Text in einer Zeile in einer Tabellenansicht auszuwählen, indem Sie mit der Maus in die Zeile klicken, in der sich der Text befindet, und nach unten ziehen (so wie es auf dem Bildschirm angezeigt wird), wird dies automatisch vom umschließenden NScrollView übernommen Sie können fortfahren, den Text zu wählen. – Jay

Antwort

2

Normalerweise befindet sich eine Textansicht in einer eigenen Bildlaufansicht. Auch wenn das groß genug ist, um den gesamten Text ohne Scrollen anzuzeigen, ist es immer noch da. Ein Aufruf von -autoscroll: auf alles innerhalb dieser Bildlaufansicht (möglicherweise einschließlich dieser Bildlaufansicht selbst?) Wird nur versuchen, diese Bildlaufansicht zu blättern, nicht die Bildlaufansicht, die die Tabellenansicht enthält.

Versuchen Sie, -autoscroll: auf einer Ansicht höher in der Hierarchie aufzurufen. Entweder self.scrollView.superview, die Tabellenzellenansicht oder die Tabellenansicht.

Beachten Sie jedoch, dass die Bildlaufansicht der Tabellenansicht weiterhin gescrollt wird, auch wenn die Zellenansicht mit der Textansicht vollständig auf dem Bildschirm angezeigt wird. In der Tat kann es so weit scrollen, dass es in der anderen Richtung vom Bildschirm verschwindet. Im Grunde wissen Sie nicht, dass Sie versuchen, in der Textansicht auszuwählen, sodass es nicht stoppt, wenn die Auswahl bis zum Rand der Textansicht reicht.

Ein anderer Ansatz könnte sein, zu versuchen, eine "bare" Textansicht ohne umschließende Bildlaufansicht zu verwenden. Ich glaube nicht, dass IB dir das erlauben wird, also müsstest du es programmatisch machen. Bloße Textansichten funktionieren jedoch nicht gut mit dem automatischen Layout.

+0

Der Aufruf von '-autoscroll:' (in der Tabellenansicht oder der umschließenden Bildlaufansicht) mit einem Ereignis aus dem Parameter '-mouseDragged: 'verursacht nichts. Vielleicht sollte ich 'NSEvent' irgendwie mutieren. – Astoria

Verwandte Themen