Apple は、Yosemite の NSPathControlItem で動作するように NSPathControl を変更しました。
しかし、私が座っているところから見ると、これらの新しいクラスはまったく機能しません。データ構造にカスタム パスを表示しようとしていますが、通常のファイル パスにも同様の問題があります。それは私ですか、それともアップルですか?
これが私のコードです:
最初のスニペットは次のように機能し、パスが表示されます。しかし、それが機能するすべてです。
//MARK: notifications
func selectionDidChange(notification : NSNotification)
{
if let item = notification.object as? Group
{
//get "path" components
var components : [String] = [item.title ?? "a"]
var ancestor : Group? = item.parent
while (ancestor != nil)
{
components.append(ancestor?.title ?? "b")
ancestor = ancestor?.parent
}
components.append("")
//convert to url
let path = ("MyScheme:/" + "/".join(components.reverse()))
pathControl?.URL = NSURL(string: path.stringByAddingPe
}
}
パスの任意の部分をクリックして NSPathControlItem からプロパティを取得しようとしても、まったく機能しません。すべてが nil を返します。
@IBAction func select(sender : AnyObject)
{
println(sender.clickedPathItem??.title)
println(sender.clickedPathItem??.URL)
}
NSPathControlItem でパスを作成しようとすると、プロパティ (タイトル、URL) を設定できません。
pathComponent.URL = NSURL(string: path.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
//let url : NSURL? = NSURL(string: "/")
//let path = NSURL(fileURLWithPath: "/")
//pathComponent.URL = path as NSURL
pathComponent.attributedTitle = NSAttributedString(string: "/atttributes")
self.pathControl?.pathItems = [pathComponent]
println(pathComponent.description)
また、NSPathControlItem はサブクラス化されるべきではありません。
ここで何が起こっているのですか?
編集
私が知る限り、NSPathControlItem には問題があります。NSPathControlItem を作成するヘルパー関数。
func pathItem(title: String, imageName: String) -> NSPathControlItem
{
let item = NSPathControlItem()
item.title = title
item.image = NSImage(named: imageName)
return item
}
NSPathControlItem を作成し、そのタイトルを出力するテスト関数。
var pathItems : [NSPathControlItem] = []
for title in ["a","b","c"]
{
pathItems.append(self.pathItem(title, imageName: NSImageNameFolder))
}
for item in pathItems
{
println(item.title)
}
予想される出力は、a、b、c の 3 行です。私はnil、b、nilを取得します。
NSPathControl に直接 pathItems を設定すると、機能します。
self.pathControl?.pathItems = [
self.pathItem("a", imageName: NSImageNameFolder),
self.pathItem("b", imageName: NSImageNameFolder),
self.pathItem("c", imageName: NSImageNameFolder)]
ただし、pathItems を間接的に設定すると、すべてが地獄になります。
self.pathControl?.pathItems = pathItems //array of NSPathControl (see above)
編集 2
私はこれをもう一度見ました。pathItem 関数で NSPathControlItem を構成します。ここでタイトルを設定します。attributedTitle を設定しても違いはありません。lldb でアイテムを検査すると、正しい (属性付きの) タイトル値が表示されます。
しかし、NSPathControlItem の配列を NSPathControl に割り当てると、タイトルの値は "" になり、attributedTitle は初期化されません。