2016-06-01 15 views
0

Ich habe einen statischen Filter zu aktivieren/deaktivieren für einen NSArrayController basierend darauf, ob ein Kontrollkästchen aktiviert ist. Im Moment habe ich das Kontrollkästchen Wert dieses gebunden:Aktivieren NSArrayController Prädikat basierend auf Kontrollkästchen

private dynamic var filterPending: NSNumber! { 
    willSet { 
     willChangeValueForKey("filterPredicate") 
    } 
    didSet { 
     didChangeValueForKey("filterPredicate") 
    } 
} 

und dann gebunden ich den Filter des NSArrayController dazu:

private dynamic var filterPredicate: NSPredicate? { 
    guard let filter = filterPending?.boolValue where filter == true else { return nil } 
    return NSPredicate(format: "pending > 0") 
} 

, die richtig zu funktionieren scheint, fühlt sich aber wie vielleicht Ich vermisse einen einfacheren Weg, dies zu tun?

+3

In ObjcC wäre es 'sein + (NSSet *) keyPathsForValuesAffectingFilterPredicate {return [NSSet setWithObjects: @ "filterPending", nil]; } ', keine Ahnung, wie das zu swift übersetzt wird. –

+0

könnte ich das auch tun, anstelle des filterPending. Ich dachte, es könnte einen leichteren Weg geben, als ein Ding zu sagen, dass sich das Prädikat ändern muss und ein anderes für das Prädikat. Grundsätzlich gibt es einen saubereren Weg, dies zu tun, ohne dass die beiden Elemente im Code ausgeführt werden. – Gargoyle

Antwort

0

In Ihrer Konfiguration hängt der Wert filterPredicatevon über den Wert filterPending ab. Als Gerd K weist darauf hin, der Schlüsselwert Beobachten API ermöglicht es Ihnen, diese Art von Beziehung zu spezifizieren durch filterPending als dependent key von filterPredicate Registrierung:

// MyFile.swift 

class func keyPathsForValuesAffectingFilterPredicate() -> Set<NSObject> { 
    return Set<NSObject>(arrayLiteral: "filterPending") 
} 

private dynamic var filterPending: NSNumber! 

private dynamic var filterPredicate: NSPredicate? { 
    guard let filter = filterPending?.boolValue where filter == true else { return nil } 
    return NSPredicate(format: "pending > 0") 
} 
+0

Sie müssen kein Objekt zurückgeben, Sie können einfach Set ("filterPending") zurückgeben – Gargoyle