Cocoa 绑定到 swift 中的可选 属性
Cocoa Binding to an optional property in swift
如何为可选数据类型的属性设置 cocoa 绑定?
我有一个 NSTableView,它通过键绑定显示来自 NSArrayController 的数据,它反过来管理 [Properties] 数组的对象,这些对象定义为:
class Property: NSObject {
var distance: CLLocationDistance
var ETA: TimeInterval?
var coordinates: CLLocationCoordinate2D
// other properties and methods here
}
在我定义的MainViewController中
var properties: [Property] = []
@IBOutlet var arrayController: NSArrayController!
其中 arrayController 绑定到 properties
数组,
NSTableView
绑定到阵列控制器(控制器密钥 = arrangedObjects
)
然后个人 TableViewCells
绑定到 Table Cell View 的各种属性(模型关键路径 = objectValue.distance
,等等)
代码编译没有任何问题,但在运行时它在尝试加载 table 时崩溃。问题在于 ETA 列,因为 properties.ETA
是可选的。处理这个问题的正确方法是什么?谢谢
你不能,至少不能直接。
Cocoa 绑定在 Objective-C 运行时工作,ObjC 无法表示 Swift 非对象的可选(又名 class 又名参考)类型。 (也就是说,您可以从 ObjC 访问 NSWindow?
,甚至 AnyObject?
,但不能访问 Int?
或 CGRect?
或 TimeInterval?
。)
你最好的选择可能是回到你在 ObjC 中做事的方式——使 ETA
成为一个非可选的 TimeInterval
,并使用一些标记值(负值-巨大的?) 表示未设置 ETA 的情况。您可以使用值转换器来确保此类情况在您的 UI.
中得到适当表示
或者,您可以保留可选的 属性 用于 Swift,并公开第二个非可选类型的计算 属性 用于绑定。
如何为可选数据类型的属性设置 cocoa 绑定?
我有一个 NSTableView,它通过键绑定显示来自 NSArrayController 的数据,它反过来管理 [Properties] 数组的对象,这些对象定义为:
class Property: NSObject {
var distance: CLLocationDistance
var ETA: TimeInterval?
var coordinates: CLLocationCoordinate2D
// other properties and methods here
}
在我定义的MainViewController中
var properties: [Property] = []
@IBOutlet var arrayController: NSArrayController!
其中 arrayController 绑定到 properties
数组,
NSTableView
绑定到阵列控制器(控制器密钥 = arrangedObjects
)
然后个人 TableViewCells
绑定到 Table Cell View 的各种属性(模型关键路径 = objectValue.distance
,等等)
代码编译没有任何问题,但在运行时它在尝试加载 table 时崩溃。问题在于 ETA 列,因为 properties.ETA
是可选的。处理这个问题的正确方法是什么?谢谢
你不能,至少不能直接。
Cocoa 绑定在 Objective-C 运行时工作,ObjC 无法表示 Swift 非对象的可选(又名 class 又名参考)类型。 (也就是说,您可以从 ObjC 访问 NSWindow?
,甚至 AnyObject?
,但不能访问 Int?
或 CGRect?
或 TimeInterval?
。)
你最好的选择可能是回到你在 ObjC 中做事的方式——使 ETA
成为一个非可选的 TimeInterval
,并使用一些标记值(负值-巨大的?) 表示未设置 ETA 的情况。您可以使用值转换器来确保此类情况在您的 UI.
或者,您可以保留可选的 属性 用于 Swift,并公开第二个非可选类型的计算 属性 用于绑定。