Frage

Apple hat ein nettes kleines Tutorial für eine einfache Master-Detail-Schnittstelle zu machen. Interface Builder wird sogar automatisch generiert für Sie von einer Core Data Einheit. Aber ich versuche, etwas komplizierter als das einfache Beispiel zu tun, und ich habe zu kämpfen für eine Weile, um es zu arbeiten.

Ich habe eine Core Data dokumentenbasierte Anwendung. Das Modell beinhaltet eine abstrakte Entität Seite, und mehrere konkreten Unter-Entitäten Seite. Alle Seiten haben einige gemeinsame Attribute (zB „Name“) und diese werden in Seite definiert. Offensichtlich haben die Unter-Entitäten, die Attribute, die sie einzigartig sind.

Ich mag die Schnittstelle, damit die Benutzer alle Arten von Seiten in der Master-Liste, um zu sehen (ein NSTableView). Wenn sie eine Seite auswählen, die die Detail Felder angezeigt werden, würde davon abhängen, welche Art von Seite ist.

Hier ist, was ich jetzt haben:

Ich habe eine Haupt-Nib-Datei, in dem die Master-Liste angezeigt wird, sowie alle Felder gemeinsam mit einer Seite. Es gibt eine Feder für jeden Seitentyp mit seinen spezifischen Bereichen. Es ist die Haupt NSArrayController in der Hauptspitze Datei, die die NSTableView wird bevölkern. Es gibt eine NSArrayController in jedem der seitenspezifischen nibs auch so, dass ich die Detailfelder Attribute der aktuellen Auswahl binden kann. Alle meine NSArrayControllers identisch konfiguriert sind, und ich habe sie alle auf die gleiche managedObjectContext und denselben selectionIndexes gebunden ist.

Ich bin mit Aaron Hillegass Methode zur Ansicht Swapping, dass er in seinem Buch beschreibt Cocoa. So registrierte ich für NSTableViewSelectionDidChangeNotifications, und wenn ich einen bekommen, es ruft eine Methode Switch:

Switch schaut auf dem aktuell ausgewählte Objekt, prüft, welche Art von Seite ist, und Swaps in der entsprechenden Nib-Datei nach Hillegass-Methode.

Alles funktioniert gut, wenn ich nur die Seiten eines Typs hinzufügen, aber sobald ich eine Seite eines zweiten Typs hinzufügen, bekomme ich diesen Fehler:

  

Fehlereinstellungswert für Schlüsselpfad selectionIndexes des Objekts (von gebundenem Objekt Einheit: Seite, die Anzahl der ausgewählten Objekte: 1): [valueForUndefinedKey:.]: Das Unternehmen NoColPage ist nicht Schlüsselwert Codierung-konform für den Schlüssel Seite

Der letzte Teil des Fehlers macht Sinn. Es Stucks versucht, die falsche Spitze angezeigt werden, so dass es versucht, auf die Felder zu binden, die für dieses Objekt nicht existieren

Ich habe ein selectionIndexes Feld so MyDocument, dass alle meine NSArrayControllers an der gleichen Stelle binden konnte. Ich habe tagelang über diese gequält und ich kann es nicht herausgefunden. Irgendwelche Ideen?

Wenn es hilft, hier ist ein Beispielprojekt Sie herunterladen. Ich extrahierte nur die Dinge relevant für dieses Problem von meinem Projekt in eine neue Dummy-Anwendung, die ich verwendet habe, zu testen und zu spielen, um.

PS: Interface Builder des Werkzeugs für eine Master-Detail-Schnittstelle von einem Core Data Einheit Erzeugung nicht funktioniert, wie ich es möchte für abstrakte Gebilde. Es schafft nur die Felder für die Attribute in der superentitity.

Edit: Ich denke, Joshua auf etwas, aber leider funktioniert es nicht - ich halte in das gleiche Problem laufen. Zuerst war ich eine harte Zeit, weil ich nicht, dass -unbind verstanden: erwartet eine String-Konstante, kein Schlüsselpfad.

Ich habe mehrere Varianten ausprobiert: wo ich den Überblick über die aktuell angezeigte Spitze der Array-Controller; wo ich den Überblick über den aktuell Seitentyp angezeigt und nur unbind / rebind wenn ich versuche, eine andere Seite zur Anzeige ...

Hier ist der relevante Abschnitt des Codes.

-(void) displayViewController: (ManagingVC *) vc withClass:(NSString*) className {

//Try to end editing
NSWindow *w = [box window];
BOOL ended = [w makeFirstResponder:w];
if (!ended) {
    NSBeep();
    return;
}

//The Managing View Controller's NSArrayController
NSArrayController* vcAc = [vc arrCont];

//if the page we're trying to switch to is NOT the same type as the current page we're displaying
//if it is, do nothing.
if (![currPageDisplayed isEqual:className]) {

    //unbind the old view controller
    ManagingVC *oldvc = [viewControllers objectForKey:className];
    NSArrayController* oldsac = [oldvc arrCont];
    [oldsac unbind:@"selectionIndexes"];

    //bind the new view controller
    [vcAc bind:@"selectionIndexes" toObject:self withKeyPath:@"selectionIndexes" options:nil];
    currPageDisplayed = className;

    NSView *v = [vc view];

    //display the new view in an NSBox in the main nib
    [box setContentView:v];
}

}

War es hilfreich?

Lösung 2

viel zu viel Zeit damit verbringen, nach jeder NIB der Array-Controller synchron zu bekommen, habe ich an diesem Ansatz aufgegeben. Das einzige, was für mich gearbeitet hat, ist programmatisch Controlling, die GUI-Elemente in der Hauptspitze angezeigt werden, und ihre Bindungen. Das bedeutet, die anderen Nibs zu beseitigen. Das ist nicht wirklich eine nachhaltige Lösung, wenn Sie mit mehr als nur ein paar Textfeldern arbeiten, aber es funktioniert für mich jetzt.

ich noch Joshua Rat von unbinding folgen, bevor die Ansicht wechseln, aber jetzt nur ich verbindlich die Textfelder zu arrayController.selection.whateverKey

Andere Tipps

Das Problem ist, dass Sie Ihre Nibs' Array-Controller sind verlassen, um die Auswahl des Dokuments gebunden, die sie (wenn die Auswahl ändert), um das ausgewählte Element zu repräsentieren, zu versuchen, verursacht.

Versuchen Sie folgendes:

  1. Entfernen Sie die Bindungen in den Nibs.
  2. Bevor Sie eine neue Ansicht hinzufügen, schließen Sie ihre Bindungen in Code.
  3. Bevor die alte Ansicht entfernen, trennen Sie ihre Bindungen im Code.

Das sollte alles glücklich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top