Scollfähiges NSTextField?

  • Scollfähiges NSTextField?

    Folgendes Problem:

    Ich habe ein mehrzeiliges Eingabefeld für Text, dass bei mehr Text als Platz einen Scrollbalken einblenden soll.

    Schon klar, wenn ich mit einem NSTextField arbeite und die Scrollfähigkeit haben möchte, sollte ich am Einfachsten auf NSTextView umsteigen. Aber das geht aus folgendem Grund nicht:
    Mein NSTextField ist ein NSTokenField (was wiederum von NSTextField abgeleitet ist).

    NSTextView fällt also aus.

    Das NSTextField einfach in einen NSScrollView zu packen reicht natürlich nicht, irgendwie muss der Frame des TextFields bei Änderung des Textes (bzw. der Größe des Scrollviews) angepasst werden.

    Bisher versuche ich dies mit Hilfe einer Funktion in meiner Ableitung von NSTextField (bzw. NSTokenField) zu erledigen, die bei jeder Änderung des Textes bzw. Größenänderung des umgebenden Scrollviews aufgerufen wird.

    Das funktioniert irgendwie auch so halb, aber eben nicht richtig.
    Eines meiner Hauptprobleme derzeit ist, den Textcursor im sichtbaren Bereich zu halten.
    Dazu rufe ich bisher die Funktion scrollRangeToVisible des FieldEditors auf:

    Quellcode

    1. NSText* fieldEditor = [[self window] fieldEditor:YES forObject:self];
    2. NSRange selection = [fieldEditor selectedRange];
    3. [fieldEditor scrollRangeToVisible:selection];

    Das klappt manchmal, aber nicht immer. Ich habe bisher kein Muster herausfinden können, wann es klappt und wann nicht.

    Ich habe auch noch ein paar Probleme (Ungenauigkeiten) bei der Berechnung der aktuellen Höhe des NSTextField aufgrund des augenblicklichen Inhalts.

    Hat zufällig jemand sowas schon mal für NSTextField oder NSTokenField gemacht und hat mir ein paar Tipps?
    Bevor man jemanden kritisiert, sollte man zuerst ein paar Meilen in dessen Schuhen gehen!
    Erstens ist man dann in sicherem Abstand und zweitens hat man die Schuhe...
  • RE: Scollfähiges NSTextField?

    Original von psog
    Folgendes Problem:

    Ich habe ein mehrzeiliges Eingabefeld für Text, dass bei mehr Text als Platz einen Scrollbalken einblenden soll.

    Schon klar, wenn ich mit einem NSTextField arbeite und die Scrollfähigkeit haben möchte, sollte ich am Einfachsten auf NSTextView umsteigen. Aber das geht aus folgendem Grund nicht:
    Mein NSTextField ist ein NSTokenField (was wiederum von NSTextField abgeleitet ist).

    NSTextView fällt also aus.

    Das NSTextField einfach in einen NSScrollView zu packen reicht natürlich nicht, irgendwie muss der Frame des TextFields bei Änderung des Textes (bzw. der Größe des Scrollviews) angepasst werden.

    Bisher versuche ich dies mit Hilfe einer Funktion in meiner Ableitung von NSTextField (bzw. NSTokenField) zu erledigen, die bei jeder Änderung des Textes bzw. Größenänderung des umgebenden Scrollviews aufgerufen wird.

    Das funktioniert irgendwie auch so halb, aber eben nicht richtig.
    Eines meiner Hauptprobleme derzeit ist, den Textcursor im sichtbaren Bereich zu halten.
    Dazu rufe ich bisher die Funktion scrollRangeToVisible des FieldEditors auf:

    Quellcode

    1. NSText* fieldEditor = [[self window] fieldEditor:YES forObject:self];
    2. NSRange selection = [fieldEditor selectedRange];
    3. [fieldEditor scrollRangeToVisible:selection];

    Das klappt manchmal, aber nicht immer. Ich habe bisher kein Muster herausfinden können, wann es klappt und wann nicht.

    Ich habe auch noch ein paar Probleme (Ungenauigkeiten) bei der Berechnung der aktuellen Höhe des NSTextField aufgrund des augenblicklichen Inhalts.

    Hat zufällig jemand sowas schon mal für NSTextField oder NSTokenField gemacht und hat mir ein paar Tipps?


    Der 'fieldEditor' ist ein sehr unzuverlässiger Zeitgenosse. Er ist nur da, wenn man ihn wirklich braucht, also gerade eine Zelle in einem Textfeld oder anderswo editiert wird. Ansonsten hält er sich im Hintergrund. Vor allem enthält er in diesem Zustand keinen Text. Den greift er sich nur vom jeweiligen 'Control', wenn er tatsächlich editieren muss. Es gibt dann auch keine Selektion, wie denn auch.
    Das könnte Dein Problemes erklären, vielleicht.

    Vielleicht deshalb, weil NSTokenField einen eigenen 'fieldEditor' der Klasse NSTokenTextView hat. Diese Klasse ist privat. Sie verhält sich sehr spezifisch zu Ihrer Aufgabe. Man kann beispielsweise, so meine Erfahrung, ohne weiteres einem NSTokenField keinen anderen 'fieldEditor' aufzwingen.
    I would be embarrassed if they did not spy on me.