@objc let managedObjectContext = ServerDataStore.default.context
- @IBOutlet var areaMatrix: NSMatrix!
- @IBOutlet var squadronTab: NSSegmentedControl!
- @IBOutlet var planesTable: NSTableView!
- @IBOutlet var airBaseController: NSArrayController!
+ @IBOutlet private var areaMatrix: NSMatrix!
+ @IBOutlet private var squadronTab: NSSegmentedControl!
+ @IBOutlet private var planesTable: NSTableView!
+ @IBOutlet private var airBaseController: NSArrayController!
+
+ private var contentObservation: NSKeyValueObservation?
override var windowNibName: NSNib.Name {
@objc dynamic var areaId: Int = 0 {
didSet {
+
updatePredicate()
updatePlaneSegment()
}
@objc dynamic var rId: Int = 1 {
didSet {
+
updatePredicate()
updatePlaneSegment()
}
private var areas: [Int] {
- guard let content = airBaseController.content as? [AirBase]
- else { return [] }
+ guard let content = airBaseController.content as? [AirBase] else {
+
+ return []
+ }
return content
- .flatMap { $0.area_id }
+ .compactMap { $0.area_id }
.unique()
.sorted(by: <)
}
override func windowDidLoad() {
super.windowDidLoad()
-
- airBaseController.addObserver(self, forKeyPath: "content", context: nil)
- }
-
- override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
-
- guard keyPath == "content" else {
- super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
- return
- }
-
- updateAreaRadio()
- updatePlaneSegment()
-
- if areaId == 0 {
+
+ contentObservation = airBaseController.observe(\NSArrayController.content) { [weak self] _, _ in
- areaId = areas.first ?? 0
- updatePredicate()
+ guard let `self` = self else {
+
+ return
+ }
+
+ self.updateAreaRadio()
+ self.updatePlaneSegment()
+
+ if self.areaId == 0 {
+
+ self.areaId = self.areas.first ?? 0
+ self.updatePredicate()
+ }
}
}
let areas = self.areas
let currentTags = areaMatrix.cells.map { $0.tag }
- if currentTags == areas { return }
+ if currentTags == areas {
+
+ return
+ }
// 最初の設定以外でareasが空の場合は処理をしない
- if areas.isEmpty, areaId != 0 { return }
+ if areas.isEmpty, areaId != 0 {
+
+ return
+ }
let cellCount = areaMatrix.numberOfRows * areaMatrix.numberOfColumns
if areas.count != cellCount {
private func updatePlaneSegment() {
- guard let content = airBaseController.content as? [AirBase]
- else { return }
+ guard let content = airBaseController.content as? [AirBase] else {
+
+ return
+ }
let area = NSCountedSet()
content.forEach { area.add($0.area_id) }
private func updatePredicate() {
- airBaseController.filterPredicate = NSPredicate(format: "area_id = %ld AND rid = %ld", areaId, rId)
+ airBaseController.filterPredicate = NSPredicate.empty
+ .and(NSPredicate(#keyPath(AirBase.area_id), equal: areaId))
+ .and(NSPredicate(#keyPath(AirBase.rid), equal: rId))
airBaseController.setSelectionIndex(0)
planesTable.deselectAll(nil)
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
- guard let identifier = tableColumn?.identifier
- else { return nil }
+ guard let identifier = tableColumn?.identifier else {
+
+ return nil
+ }
return tableView.makeView(withIdentifier: identifier, owner: nil)
}