2016년 5월 17일 화요일

NSTableView Cheatsheet

NSTableView 에 대해 개인적으로 겪거나 필요한 내용을 정리했다. 이 글은 지속적으로 업데이트 될 수도 있다.

Hide Column Header


컬럼 헤더(Column Header)를 숨기고 싶다면 인터페이스 빌더에서 테이블뷰(NSTableView)를 선택 한 후 속성에서 Headers 의 체크를 해제하면 된다.

Column Size Problem

컬럼을 삭제하거나 기타 이유로 싱글 컬럼을 만들었을 때 셀의 넓이(width)가 작게 고정되어서 테이블이 늘어나도 이에 맞게 늘어나지 않는 현상이 생길 때가 있다. 이럴 때는 테이블 전체의 크기를 셀 크기보다 작게 줄였다가 다시 원래 크기로 늘리면 해결될 수도 있다.

아무래도 인터페이스 빌더의 버그라고 생각된다.

Data Source and Delegate

컨트롤러 없이 코드로 테이블의 내용을 채울 때 필요한 최소한의 데이터소스와 딜리게이트 예제소스이다. 셀 기반과 뷰 기반이 약간 다르다.

Cell Based:
func numberOfRowsInTableView(_ tableView: NSTableView) -> Int {
  return self.someItems.count
}

func tableView(_ tableView: NSTableView,
               objectValueForTableColumn tableColumn: NSTableColumn?,
               row row: Int) -> AnyObject? {

  if tableColumn!.identifier == "some-column-identifier" {
    return "column value for row \(row)"
  }
  ...
}

View Based:
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
  return self.someItems.count
}

func tableView(_ tableView: NSTableView,
               viewForTableColumn tableColumn: NSTableColumn?,
               row row: Int) -> NSView? {

  if tableColumn!.identifier == "some-column-id" {
    let cell = tableView.makeViewWithIdentifier("some-cell-id", owner: nil)
      as! NSTableCellView
    cell.textField!.stringValue = "some label text"
    return cell
  }
  ...
}

Select Row Programatically

특정 열(Row) 선택하기
tableView.selectRowIndexes(NSIndexSet(index: row), byExtendingSelection: false)

Handle Double Click


특정 열(Row)을 더블클릭 하는 경우는 어떻게 인식할까. 인터페이스 빌더에서 doubleAction 에 대한 액션 핸들러를 만들면 된다.

Disable Selection

셀이나 열 선택을 막기 위해서는 NSTableViewDelegate 의 아래 녀석을 아래처럼 빈 인덱스 셋을 돌려주는 방식으로 구현해 주면 된다.
func tableView(tableView: NSTableView, 
               selectionIndexesForProposedSelection 
                 proposedSelectionIndexes: NSIndexSet) -> NSIndexSet {
  return NSIndexSet()
}

댓글 없음 :