Expand All Children
아웃라인 뷰의 모든 아이템이 펼쳐진 채로 보이길 원한다면 아래 코드를 넣어주자.self.outlineView!.expandItem(nil, expandChildren: true)
Item Padding
각 셀 간 여백(padding 혹은 margin)을 두길 원한다면 intercallSpacing 이라는 걸 이용해 보자.self.outlineView!.intercellSpacing = NSSize(width: 0, height: 16)
DataSource and Delegate
별도의 컨트롤러 없이 코드로 데이터를 채울 경우 필요한 최소한의 코드 예제이다. 아웃라인에선 셀 기반은 잘 안쓰이는 것 같으니 생략한다.View Based:
func outlineView(outlineView: NSOutlineView,
isItemExpandable item: AnyObject) -> Bool {
return item is SomeItemGroup
}
func outlineView(outlineView: NSOutlineView,
numberOfChildrenOfItem item: AnyObject?) -> Int {
if item == nil {
return self.groups.count
}
else {
let group = item as! SomeItemGroup
return group.items.count
}
}
func outlineView(outlineView: NSOutlineView,
child index: Int,
ofItem item: AnyObject?) -> AnyObject {
if item == nil {
return self.groups[index]
}
else {
let group = item as! SomeItemGroup
return group.items[index]
}
}
func outlineView(outlineView: NSOutlineView,
viewForTableColumn tableColumn: NSTableColumn?,
item: AnyObject) -> NSView? {
if item is SomeItemGroup {
let group = item as! SomeItemGroup
let cell = outlineView.makeViewWithIdentifier("SomeGroupCellID", owner: self)
as! NSTableCellView
...
return cell
}
else if item is SomeItem {
let item = item as! SomeItem
let cell = outlineView.makeViewWithIdentifier("SomeItemCellID", owner: self)
as! NSTableCellView
...
return cell
}
...
}
Source List
인터페이스 빌더에서 제공되는 소스리스트는 아웃라인뷰를 이용해 만들어져 있다. 따라서 같다고 생각하자. 소스리스트의 경우 좀 특별한 점은 Header(펼칠 수 있는 아이템)은 HeaderCell 로 아이디가 기본적으로 지정된다는 점이다. 그리고 각 헤더에 들어가는 아이템은 DataCell 이라는 이름이 기본적으로 지정된다.Hide Disclosure Triangle Icon
각 그룹을 묶었다 폈다 하기 위한 작은 삼각형(Disclosure Triangle)을 없애고 싶다면 NSOutlineView 를 상속받아서 아래 메소드를 오버라이드 한다.class NoDisclosureOutlineView: NSOutlineView {
override func frameOfOutlineCell(atRow row: Int) -> NSRect {
return NSRect.null
}
}
Remove Indentation
각 그룹의 아이템이 펼쳐지면 기본적으로 왼쪽에 약간의 여백(Indentation)이 있다. 이 여백을 없애려면 NSOutlineView 를 상속받아서 아래 메소드를 오버라이드 한다.class NoIndentationOutlineView: NSOutlineView {
override func frameOfCell(atColumn column: Int, row: Int) -> NSRect {
let superFrame = super.frameOfCell(atColumn: column, row: row)
if column == 0 {
return NSRect(x: 0,
y: superFrame.origin.y,
width: superFrame.size.width,
height: superFrame.size.height)
}
else {
return superFrame
}
}
}
[관련글] NSTableView Cheatsheet
0 comments:
댓글 쓰기