2015-11-01 63 views
0

我正在创建一个NSOutlineView。在实现数据源时,尽管我可以创建顶层,但我无法实现childHierarchy。原因是我无法阅读项目:AnyObject?,它阻止我从字典中返回正确的数组。NSOutlineView,使用项目:AnyObject

//MARK: NSOutlineView 
var outlineTopHierarchy = ["COLLECT", "REVIEW", "PROJECTS", "AREAS"] 
var outlineContents = ["COLLECT":["a","b"], "REVIEW":["c","d"],"PROJECTS":["e","f"],"AREAS":["g","h"]] 

//Get the children for item 
func childrenForItem (itemPassed : AnyObject?) -> Array<String>{ 
    var childrenResult = Array<String>() 
    if(itemPassed == nil){ //If no item passed we return the highest level of hirarchy 
     childrenResult = outlineTopHierarchy 
    }else{ 


     //ISSUE HERE: 
     //NEED TO FIND ITS TITLE to call the correct child 
     childrenResult = outlineContents["COLLECT"]! //FAKED, should be showing the top hierarchy item so I could return the right data 


    } 
    return childrenResult 
} 


//Data source 
func outlineView(outlineView: NSOutlineView, child index: Int, ofItem item: AnyObject?) -> AnyObject{ 
    return childrenForItem(item)[index] 
} 

func outlineView(outlineView: NSOutlineView, isItemExpandable item: AnyObject) -> Bool{ 
    if(outlineView.parentForItem(item) == nil){ 
     return true 
    }else{ 
     return false 
    } 
} 

func outlineView(outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int{ 
    return childrenForItem(item).count 
} 


func outlineView(outlineView: NSOutlineView, viewForTableColumn: NSTableColumn?, item: AnyObject) -> NSView? { 

    // For the groups, we just return a regular text view. 
    if (outlineTopHierarchy.contains(item as! String)) { 
     let resultTextField = outlineView.makeViewWithIdentifier("HeaderCell", owner: self) as! NSTableCellView 
     resultTextField.textField!.stringValue = item as! String 
     return resultTextField 
    }else{ 
     // The cell is setup in IB. The textField and imageView outlets are properly setup. 
     let resultTextField = outlineView.makeViewWithIdentifier("DataCell", owner: self) as! NSTableCellView 
     resultTextField.textField!.stringValue = item as! String 
     return resultTextField 
    } 

} 

}

我用这个作为参照,虽然它的Objective-C的implemented

回答

0

您需要的item转换为正确的类型为您的轮廓。通常你想使用一个真正的数据模型,但对你的玩具问题,在层次结构中正好有两个层次,这足够了:

func childrenForItem (itemPassed : AnyObject?) -> Array<String>{ 
    if let item = itemPassed { 
     let item = item as! String 
     return outlineContents[item]! 
    } else { 
     return outlineTopHierarchy 
    } 
} 
+0

完美的作品,非常感谢! – MMV