Bindings: Button durch NSArrayController.selection de-/aktivieren

  • Bindings: Button durch NSArrayController.selection de-/aktivieren

    Ich möchte einen NSButton (Push Button) in Abhängigkeit des Vorhandenseins der Selektion einer NSTableView aktiviere bzw. deaktivieren.
    Für die NSTableView gibt's einen NSArrayController, der die View füllt und ja auch über den Key "selection" die Selekton verwaltet.

    Wie kann ich nun den Botton über dessen Binding "enabled" aktivieren bzw. deaktivieren?

    Was nicht funktioniert ist, einfach im IB "enabled" mit dem NSArrayController.selection zu binden. Es tritt dann folgende exception auf:
    "Cannot create BOOL from object <_NSControllerObjectProxy: 0x57eeb0> of class _NSControllerObjectProxy"
    Es hilft auch nicht einen NSIsNotNil-Transformer dazwischen zu hängen, da NSArrayController.selection auch bei keiner Selektion ein Controller-Objekt zurückgibt (_NSControllerObjectProxy).
    Laut Doku soll bei keiner Selektion das Marker-Objekt "NSNoSelectionMarker" zurückgegeben werden. Wie kann ich aber ohne Code zuschreiben (nur über den IB) auf dieses Objekt abfragen?

    In ähnlichen Beispielen wird der Button mit NSArrayController.selection.canRemove verbunden. Erstens habe ich aber keinen editierbaren Controller und zweitens möchte nur abfragen, ob eine Selektion existiert (und nicht ob sie löschbar ist).

    Hat jemand eine Lösung?
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Herjeh, ich habe mich vor Ewigkeiten damit mal beschäftigt, weiß es aber auch nicht mehr. Der Trick war es irgendwie einen Value-transformer zu nehmen. Wen nich mich recht erinnere, habe ich mir einen geschrieben, der isEmpty hieß. Dann habe ich die Eigenschaft an die selection gebunden und als Transformer den angemeldet. Habe nicht weiter herumprobiert, weil ich ohnehin an isEditable binden musste, was dann ging.

    Hast du 2, 3 Tage Zeit?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Eilt nicht ;)

    Irgendwie merkwürdig, dass Apple an die ganzen anwendungsspezifischen Fälle von editierbaren Arrays gedacht hat, aber nicht an den grundlegendsten Fall: auf das Vorhandensein einer Selektion abzufragen. Hierfür extra einen Transformer schreiben zu müssen, finde ich etwas übertrieben.
    Falls das Ganze sich nicht mit den Boardmitteln im IB erledigen lässt, wäre es wohl über die "klassische" Methode am einfachsten: Im Delegate des NSTabelView die selektionsbezogenen Notifications abhorchen und dann den Button programmatisch aktivieren/deaktivieren.
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Ich weiß das auch nicht und freue mich, dass du auch das Problem hast. Ich dachte nämlich immer, das ist mein Fehler. :)

    Anders geht es offenbar nicht. NSIsNil geht nicht, weil das selection-Array nicht nil ist, wenn du keine Selektion ausgewählt hast. Das dachte halt ich.

    Du weißt aber, dass du eine Selektion erzwingen kannst. Das klappt freilich nicht, wenn du alle Member des Arrays löschst.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Soweit ich weiß, geht canRemove auch mit non-editable Controllern - das Binding würde also funktionieren. Andererseits hast Du Recht, dass diese Vorgehensweise eher Bauchschmerzen erzeugt als das Gefühl, das Problem sauber gelöst zu haben.

    Ich habe eben etwas herumgespielt - nicht viel schöner, aber immerhin etwas, wäre, das Enabled des Buttons an selectionIndexes.count zu binden. Count ist zwar nicht vollständig KVC-kompatibel (weil setCount fehlt), aber für Read-Only reicht es. Oder sieht da jemand von den Binding-Gurus ein ganz böses Problem? War ja nur so 'ne Idee...
    Multigrad - 360°-Produktfotografie für den Mac
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Ich habe das einfach mit selectedObjects.count nicht hinbekommen. Wenn es mit den Indexes geht, umso besser. Ich habe damit kein Problem. Es ist normal, dass eine Eigenschaft keinen Setter hat. Es dürfte dort auch nichts gesetzt werden. :)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Habs mal schnell geschrieben

    Es hat mich dann doch nicht losgelassen.

    Verbunden werden muss das ganze mit einer Collection, also einem Array usw. Hierauf wird count gemacht. Ist count 0, liefert der Transformer YES, andernfalls NO.

    Nicht vergessen, den Transfomer als isEmptyCollection anzumelden:

    Quellcode

    1. [NSValueTransformer setValueTransformer:[IsEmptyCollectionValueTransformer valueTransformer]
    2. forName: @"isEmptyCollection"];



    Bei mir funktioniert's.

    Viel Spaß!
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Original von mattikIch habe eben etwas herumgespielt - nicht viel schöner, aber immerhin etwas, wäre, das Enabled des Buttons an selectionIndexes.count zu binden.

    so hab ich es auch gemacht, spricht nichts dagegen. Denn jedes Bool ist nur eine zahl. Ich glaube sogar, dass BOOL als char deklariert ist. 0 = false, alses andere ist true und damit hast du schon dein BOOL, weil ja die selection 0 items oder merh haben kann...

    Count ist zwar nicht vollständig KVC-kompatibel (weil setCount fehlt), aber für Read-Only reicht es.

    du musst nicht mal für den zugriff auf die objekte nen setter haben. Den brauchst du nur, wenn du dem user erlauben willst, da was zu ändern.

    Max
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Sakra, mit den SelectionIndexes scheint das wirklich zu funktionieren. Das muss ich mir mal länger anschauen.

    Also, den ValueTransformer habe ich dann nichht nur kostenlos, sondern sogar umsonst programmiert.

    Ach, bevor ich es vergesse: Meine Lösung mit isEditable funktionierte so, dass das zurückgegebenen Object (.selection) abgefragt wurde. Das war nil -> notEditable
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Original von Tom9811
    Kannst du mir kurz die Bindings-Einstellungen geben. Ich bekomme das nicht hin. Der meckert immer: Cannot create BOOL ...

    Controller Key = selectionIndexes
    Model key Path = count
    sonst keine Einstellungen

    Max
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Ja, habe ich zwischenzeitlich selbst gesehen.

    So hatte ich es mal versucht (allerdings mit selectedObjects, was keinen Unterschied machen sollte) und es hat nicht geklappt. *Schulterzuck* Jetzt mache ich es entweder mit isEditable oder meinem Transformer.

    Ich glaube ürbigens nicht, dass es pure C-Logik ist. Da hätte man etwas Schweirigkeiten, die Methode count aufzurufen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    naja, doch. Mit der logik meinte ich das hier:
    • count = 0 = false
    • count != 0 != false = true

    die count methode ist ein einfacher accessor, der einen wert liefert. Dass es dafür keinen setter gibt mag tragisch sein, aber was solls. Was mich wundert ist, warum das nich mit selectedObjects geht, das liefert ja ein array, dass diese funktion bekanntlich auch hat...
  • RE: Bindings: Button durch NSArrayController.selection de-/aktivieren

    Ist mir auch ein Rötsel. Irgendwann schaue ich mir das mal in Ruhe an. Aber ist alles andere als dringlich. Es gibt ja jetzt schon indestens drei Varianten das zu machen. *Schulterzuck* Wieso sollte man sich dann lang über eine auslassen, die nicht funktioniert.

    PS: du meinst sicher ==
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?