NSOutlineView Cheatsheet

NSOutlineView 에 대해 겪거나 필요한 내용을 정리한다. 이 글은 계속 업데이트 될 수 있다. 기본적인건 NSTableView 와 비슷하니 참고하자.

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

댓글

이 블로그의 인기 게시물

버전(Version)을 제대로 이해하기

소수점 제거 함수 삼총사 ceil(), floor(), round()