2013-09-23 4 views
9

나는 소스 목록 스타일의 사이드 바를 가진 상당히 기본적인 MainWindow.xib을 가지고있다. 소스 목록 템플릿을 이미 두 개의 NSTableCellView : HeaderCellDataCell이 포함 된 창으로 드래그하여 만들었습니다.NSTableCellViews는 어떻게 배치되어야합니까?

후자는 아이콘 (NSImageView 사용)과 레이블 (NSTextField)로 구성됩니다. 대신 레이블 아래에 작은 레이블이 필요합니다. 다음과 같이 IB,이 보인다 :

Source list according to IB

을 그냥 DataCell에 집중하면, 그에 따라 강조 :

DataCell highlighted

것은 실제로 프로그램을 실행, 그것은이 같은 아무것도 보지 않는다 템플릿 :

Second item in live DataCell selected

두 개의 NSTextField이 어떻게 하나가 될 수 있는지 알아보십시오. 내 이해는보기 기반의 NSOutlineView (보기 기준으로 NSTableView)이 IB 내에서 템플리트로 설계된 것으로 가정합니다. 대신 템플릿의 치수가 거의 무시되는 것 같습니다. 여기

는 데이터 소스에서 뷰의 값을 설정하는 코드입니다 :

public class TourSourceListDelegate : NSOutlineViewDelegate 
{ 
    public override bool IsGroupItem(NSOutlineView outlineView, MonoMac.Foundation.NSObject item) 
    { 
     return (item as TourSourceListDataSource.Item).IsHeader; 
    } 

    public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, MonoMac.Foundation.NSObject item) 
    { 
     if (IsGroupItem(outlineView, item)) 
     { 
      return outlineView.MakeView("HeaderCell", this); 
     } 
     else 
     { 
      var data = item as TourSourceListDataSource.Item; 
      var dataView = outlineView.MakeView("DataCell", this); 

      (dataView.Subviews[0] as NSTextField).StringValue = data.Name; 
      (dataView.Subviews[1] as NSTextField).StringValue = data.Date_start.ToShortDateString(); 

      return dataView; 
     } 
    } 
} 

내가 GetRowHeight을 무시하려했지만, 그 문제를 해결하지 않는 것 (그것은 더 많은 공간을 만들지 만, 여전히 은보기가 올바르게 배포되지 않도록합니다.) 또한 필요하지 않습니다.

다양한 Autosizing, Autoresizes Subviews 등으로 재생 해봤지만 IB에서 토글되지만 직관적 인 결과는 보이지 않으며 다시는 필요하지 않습니다. IB 실제로는 약간 긴 라벨을 붙이는 것만으로도 내가 원하는 것입니다.

아직 이것을 AutoLayout으로 변환하지 않았습니다.

어떤 명백한 단계가 빠졌습니까?

아마도 차이가없는 정보가 더 있습니다. Xcode 5.0, MacOSX10.8.sdk, Xamarin Studio 4.0.12, Xamarin.Mac 4.0.12 및 Mono를 포함한 Xamarin.Mac/MonoMac 프로젝트입니다. 3.2.3 (Mono/.NET 4.0 대상). 또한 App Sandboxing을 사용하도록 설정했습니다.

답변

1

인터페이스 빌더에서 중요한 점은 뷰 계층 구조입니다. 그 세포는 어떤 종류의 견해입니까? 그 레이블은 정말로 셀뷰의 하위보기입니까 아니면 아닙니다? 내가 dataView.Subviews[0][1]에 액세스하고 볼 수 있음을 수상한입니다

example NSOutlineView cell hiearchy

한 가지 : 계층 구조 같은 것을 보일 것입니다. 셀에 하위 뷰를 추가하는 경우 하위 클래스 'IBOutlet'속성에 각각 연결하여 고유 한 NSTableViewCell 하위 클래스를 만들어야합니다.서브 클래스는 구현시에 코드가 필요하지 않으며, titleFielddescriptionField과 같은 속성 선언을 선언하고이를 자동으로 합성하는 @implementation과 같이 공백으로 선언합니다.

그런 makeViewWithIdentifier (또는 apprently 접착제 자 마린에서 MakeView) 전달 될 때 올바른 식별자가 NSTableViewCell 서브 클래스를 작성해야하며, 런타임에 당신이 확인할 수 있습니다 디버거에서 po dataView을 사용하여 해당. 그런 다음 어떤 뷰가 서브 뷰 배열의 어느 위치에 있다고 가정하지 않고 NSTableViewCell 하위 클래스의 속성을 사용하여 하위 뷰에 액세스합니다. dataView.titleFielddataView.descriptionField을 사용합니다. 휴대 뷰는 하나 개의 텍스트 필드가있는 경우

당신은 서브 클래 싱없이 NSTableViewCell를 사용할 수 있지만 textField 콘센트를 연결합니까 (그 당신이 셀 뷰의 레이블보기 다시 &을 삭제하지 않는 한 기본적으로 연결) 그래서 속성을 통해 서브 뷰 배열로 다이빙하는 대신 다시 액세스 할 수 있습니다.

모두 당신이 당신이 무엇인지보고있는 이유는 분명하지 않습니다. 그것들은 여러분이 기대하는 하위보기가 아니며 잘못된 글꼴과 잘못된 위치처럼 보일 수도 있습니다. NSTableViewCell의 사용자 정의 하위 클래스를 사용하고 런타임에 해당 클래스를 검증하는 것이 예상 된 뷰를 작성하는 좋은 방법이지만 po [dataView _subtreeDescription]을 사용하여 디버거에서 서브 뷰를 덤프 할 수도 있습니다.