2016-08-15 9 views
2

뷰 기반 NSTableView이 있는데 특정 행의 모양을 사용자 정의하려고합니다.Interface Builder에서 NSTableRowView를 프로토 타입하는 방법

제목에 언급 된 위임 메서드를 구현해야한다는 것을 알고 있습니다. 그러나 나는 그것을하는 방법에 대해 잘 모르겠습니다.

문서는 말한다 : 행보기를 사용자 정의 할 수 : rowViewForRow :

당신은 대리자 메서드의있는 tableView를 사용할 수 있습니다. 일반적으로 Interface Builder를 사용하여 NSTableRowView 테이블의 프로토 타입 행을 디자인하고 배치합니다. 프로토 타입 셀과 마찬가지로 프로토 타입 행은 런타임에 프로그래밍 방식으로 검색됩니다. NSTableRowView 서브 클래스의 구현은 전적으로 선택 사항입니다.

그러나, 세포와는 달리, 인터페이스 빌더에는 NSTableRowView 클래스가 없으며, 그것은 분명 설정하는 방법 "프로토 타입"행보기를합니다.

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? 
{ 
    if (row % 4) == 0 { 
     // .................................................. 
     // [ A ] SPECIAL ROW: 

     if let rowView = tableView.make(withIdentifier: "SpecialRow", owner: self) as? NSTableRowView { 

      rowView.backgroundColor = NSColor.gray() 
      return rowView 
     } 
     else { 
      return nil 
     } 

     //^Always returns nil (Because I don't know how 
     // to setup the prototype in Interface Builder) 
    } 
    else{ 
     // .................................................. 
     // [ B ] NORMAL ROW (No customization needed) 

     return nil 
    } 
} 

내가 세포 -i.e., -tableView:viewForTableColumn:row: 근무 유사한 코드를 가지고 :

나는이 같은 (스위프트 3) 노력하고 있어요.

답변

1

OK, 그래서 확실한 해결책 일 (?)는 :

인터페이스 빌더, 드래그하고는 특정 열에서 드롭을 받아 들일 것입니다 (테이블에 일반 바닐라 NSView 드롭,
  1. 테이블 뷰의 직접적인 자식이 아닌).

  2. 방금 ​​놓친보기에 대한 Identity Inspector로 이동하여 클래스를 "NSTableRowView"로 변경하십시오.

  3. . 내 코드 에서처럼 .backgroundColor 속성을 설정하는 것이 효과가 없으므로 대신 this solution을 사용하고 자식으로 상자보기를 추가하고 인터페이스 작성기에서 구성했습니다. 상자와 행 뷰 사이에 autolayout 제약 조건을 설정해야하므로 런타임에 행 뷰의 실제 크기로 늘어납니다. 그것은 내 코드는 내가 사용 된 backgroundColor 속성을 밝혀 :


UPDATE는 (또는, 나는 ... 행보기의 wantsLayer 속성을 해왔다 수) NSTableRowView에 정의되어 있습니다 (NSView에는 UIView과 달리 이러한 속성이 없습니다).

그러나 그것은 또한 테이블 뷰의 설정에 의해 무시됩니다 (즉, 행 여부를 교대), 그래서 대신에 나는이 방법을 정의한다 : (

func tableView(_ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int) 
{ 
    if (row % 4) == 0 { 
     rowView.backgroundColor = NSColor.controlAlternatingRowBackgroundColors()[1] 
    } 
    else{ 
     rowView.backgroundColor = NSColor.clear() 
    }  
} 
... 후 추가되었다 및 테이블보기로 구성된 배경색).

(덧붙여 말하자면, 결국 사용자 정의 행보기가 필요하지 않습니다. 적어도 배경색을 사용자 정의하지 마십시오.)