Xcode11 OSX Swift 5 NSScrollView Inhalt löschen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Xcode11 OSX Swift 5 NSScrollView Inhalt löschen

    Hallo,

    damit der ganze Text gelesen werden kann, gebe ich diesen mittels NScrollView aus. Dies erreiche mit folgendem Code:

    Quellcode

    1. @IBOutlet weak var textScroll: NSScrollView!
    2. var textNachricht: String?
    3. ...
    4. textScroll.documentView!.insertText(textNachricht)

    Dies funktioniert einwandfrei. Aber wie lösche, evtl. schon vorhandene Ausgaben?


    Quellcode

    1. textScroll.removeFromSuperview()
    Mit obigem Code wird der ganze View entfernt. Das möchte ich nicht, sonder nur evtl. vorhandene Ausgaben.

    Was berücksichtige ich nicht? Wie funktioniert dies?


    Mal vorab ein Danke
  • MCDan schrieb:

    Na ja, wahrscheinlich ist der Document View in Deinem ScrollView ein NSTextView. ;)
    :/ Du liegst damit bestimmt richtig. Nur ... wie bringt mich dies nun zum Ziel. Sorry, bin einfach schon wieder zu lange auf den Beinen. Wärst Du so gut und könntest dies ein wenig mehr ausführen?

    Ich habe es nun mal mit folgendem Code realisiert:

    Quellcode

    1. textScroll.documentView!.selectAll(self)
    2. textScroll.documentView!.deleteBackward(self)
    Erst mal alles selektieren und dann zurücksetzen. Dies geht bestimmt noch einfacher, oder?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OSXDev ()

  • Ein NSTextView hat ein NSTextStorage (textStorage), welches von NSMutableAttributedString abgeleitet ist.

    Änderungen am "Inhalt" des NSTextViews sollten direkt über den Text Storage durchgeführt werden. Du kannst und solltest also direkt den Text Storage ansprechen.

    Mit deleteCharacters(in:) von NSMutableAttributedString kannst Du Zeichen in dem übergebenem Range löschen. Den passenden Range, um z.B. alles zu löschen, kannst Du über das Property length ermitteln.
  • MCDan schrieb:

    Ein NSTextView hat ein NSTextStorage (textStorage), welches von NSMutableAttributedString abgeleitet ist.

    Änderungen am "Inhalt" des NSTextViews sollten direkt über den Text Storage durchgeführt werden. Du kannst und solltest also direkt den Text Storage ansprechen.

    Mit deleteCharacters(in:) von NSMutableAttributedString kannst Du Zeichen in dem übergebenem Range löschen. Den passenden Range, um z.B. alles zu löschen, kannst Du über das Property length ermitteln.
    ?( Also diese beiden Methoden s.u. werden mir nicht mehr angeboten:
    textStorageDidProcessEditing(notification: Notification)
    textStorageWillProcessEditing(notification: Notification)

    Sind beide grau hinterlegt und durchgestrichen. :/ Oder bin ich hier völlig auf dem falschen Pfad unterwegs?

    Nachtrag: Wenn ich versuche den textStorage auszuwählen (textScroll.textStorage...) erhalte ich folgende Compilermeldung: "Value of type 'NSScrollView' has no member 'textStorage'"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev ()

  • MyMattes schrieb:

    Ich glaube, @MCDan will Dir sagen, dass Du die Methoden / Properties bei TextView und nicht ScrollView suchen sollst... Es ist die DocumentView der ScrollView, die (wahrscheinlich) eine TextView ist.

    Mattes
    Okay - leuchtet ein. Habe ein neues Outlet (NSTextView!) angelegt. Nun konnte ich alle Hinweise (Methoden / Properes) finden.

    Quellcode

    1. outletTextView.textStorage?.mutableString.setString("Test")

    Mit obigem Code wollte ich nun einen String einfügen, doch dies führt nur zu einer Exeception. ;( Die Meldung lt. : "[NSScrollView textStorage]: unrecognized selector sent to instance". ?(

    Nachtrag: Dieser Code s.u. führt ebenfalls zur gleichen Meldung s.o..

    Quellcode

    1. print("Länge: ", outletTextView.textStorage?.mutableString.length
  • MCDan schrieb:

    Ok, iIch versuche es mal mit Code, wobei ich keine Gewähr für die korrekt Syntax übernehme. :P

    Quellcode

    1. let textView = textScroll.documentView
    2. let textStorage = textView.textStorage
    3. textStorage.deleteCharacters(in:NSMakeRange(0,textStorage.length)
    Syntax stimmt. :thumbsup:

    Nach der Eingabe von Zeile 2. erhalte folgenden Hinweis: "Value of type 'NSView?' has no member 'textStorage'" ?(

    Hier läuft doch irgendwie etwas schief. :/ Könnte es sein, dass ich vielleicht das falsche Objekt im VC verwende?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OSXDev ()

  • MCDan schrieb:

    Na ja, da scheint die Syntax dann doch nicht ganz zu passen, wenn der Compiler meckert.

    Ich stehe mit Swift halt immer noch auf dem Kriegsfuß, weil die Syntax nicht wirklich intuitiv für mich ist.

    Versuche es mal so:

    Quellcode

    1. let textView = textScroll.documentView as! NSTextView
    Die Syntax passt. :thumbsup:

    Habe ein völlig neues Test-Projekt angelegt und siehe da, es ist von Erfolg gekrönt. :D

    Ich konnte nicht wirklich einen Unterschied erkennen. ;)

    @MCDan: Dir mal ein großes Dankeschön für Deine Unterstützung. Einfach TOP :thumbsup:


    Nachtrag: War gestern wohl viel zu müde, sonst hätte ich gleich erkannt, dass bei der Namesvergabe und der Zuordnung der Outlets etwas nicht stimmt. :saint:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von OSXDev ()