2011-03-19 3 views
5

IB에서 내 자신의 UITableViewCell을 디자인 할 수 있기를 원합니다. 하지만 IB에서 정의한 레이블에 액세스하려고 할 때 null ref 예외가 계속 발생합니다.Interface Builder에서 사용자 정의 UITableViewCell을 사용하는 방법은 무엇입니까?

여기에 내가 뭘 내용은 다음과 같습니다 인터페이스 빌더에서

:

  • 내가 "보기"를 제거하고 대신있는 UITableViewCell을 추가했다.
  • UITableViewCell의 클래스를 "TestCellView"으로 변경했습니다.
  • 셀에 UILabel이 추가되었습니다.
  • 콘센트 "oLblText"~ TestCellView을 추가하고 UILabel에 연결합니다.
  • 클래스 식별자를 "TestCellView"로 변경했습니다.

TestCellView.xib.cs

public partial class TestCellView : UITableViewCell 
{ 
    public TestCellView(string sKey) : base(UITableViewCellStyle.Default, sKey) 
    { 
    } 

    public TestCellView(IntPtr oHandle) : base(oHandle) 
    { 
    } 

    public string TestText 
    { 
     get 
     { 
      return this.oLblText.Text; 
     } 
     set 
     { 
         // HERE I get the null ref exception! 
      this.oLblText.Text = value; 
     } 
    } 
} 

을 구현 ** TestCellView.designer.cs ** 내 테이블의 소스에서

[MonoTouch.Foundation.Register("TestCellView")] 
public partial class TestCellView { 

    private MonoTouch.UIKit.UILabel __mt_oLblText; 

    #pragma warning disable 0169 
    [MonoTouch.Foundation.Connect("oLblText")] 
    private MonoTouch.UIKit.UILabel oLblText { 
     get { 
      this.__mt_oLblText = ((MonoTouch.UIKit.UILabel)(this.GetNativeField("oLblText"))); 
      return this.__mt_oLblText; 
     } 
     set { 
      this.__mt_oLblText = value; 
      this.SetNativeField("oLblText", value); 
     } 
    } 
} 

:

public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath) 
{ 
    TestCellView oCell = (TestCellView)tableView.DequeueReusableCell("myCell"); 
    if(oCell == null) 
    { 
     // I suppose this is wrong but how to do it correctly? 
       // this == my UITableViewSource. 
       NSBundle.MainBundle.LoadNib("TestCellView", this, null); 
     oCell = new TestCellView("myCell"); 
    } 
    oCell.TestText = "Cell " + indexPath.Row; 
    return oCell; 
} 

모든 셀에 대해 UIViewController가 포함 된 솔루션은 필요하지 않습니다. 이 작업을 수행하는 웹에서 몇 가지 예를 보았습니다. 나는 그것이 총 과잉이라고 생각한다.

내가 뭘 잘못하고 있니?

답변

3

우선 디자인의 문제입니다. 표보기가 항상 정적 콘텐츠가있는 셀 (예 : '설정'보기)을로드하는 경우 원하는 모든 행에 대해 맞춤 셀을 만들고 각 셀을 콘센트에 연결합니다.

  1. 가있는 UITableViewCell을 상속 모든 당신이 인터페이스 빌더를 잊고, 프로그래밍 방식에서 원하는보기 클래스를 만듭니다 그렇지 않은 경우

    는 다음 두 가지 옵션이 있습니다.

  2. 컨트롤러가있는 보기를 새로 고치십시오. 거기에있는보기를 바꾸고 이전과 동일하게 처리하십시오. File 's Owner의 콘센트에 셀을 연결해야한다는 사실을 제외하고는. 따라서 컨트롤러를 인스턴스화하면 모든 셀의 하위 뷰가 괜찮아집니다.

그것은 잔인한 사람이 아니거나 적어도 애플은 권장 : click and go to the "Loading Custom Table-View Cells From Nib Files" paragraph

PS : 그냥 비슷한 상황이 있었다 이것은 내가했던 방법입니다. MonoTouch에서이 예제의 경우에는 LoadNib을 사용할 필요가 없습니다. 그냥 테이블의 소스에 GetCell 재정의 내부에서이 작업을 수행 :

using (CellController controller = new CellController()) 
{ 

    cell = (CustomCell)controller.View; 

} 

가 어쩌면있는 UIView에서지지 않도록 CellController 객체 내부에 별도의 콘센트를 선언합니다.

+2

그게 정확히 지금 가지고있는 방법입니다. 나는 컨트롤러가있는 것을 좋아하지 않는다. 그 이유는 기본 셀 스타일을 사용할 때 컨트롤러가 없기 때문입니다. 그래서 애플은 컨트롤러가 필요 없다고 결정했다. 맞춤형 셀을 만들 때 셀 당 하나의 컨트롤러가 필요합니다. – Krumelur

+1

예 기본 셀 스타일을 사용하는 경우 프로그래밍 방식으로 셀을 만들므로 컨트롤러가 필요하지 않습니다. 하지만 NIB 파일에서로드되는 일반적으로 사용자 인터페이스 개체 인 셀을 사용하려고합니다. NIB 파일에 사용자 정의 셀을 놓는 것만으로는 충분하지 않습니다. 그것은 FileViewer와 어떻게 든 연결되어야합니다.이 경우에는 UIViewController 여야합니다. –

1

확인하십시오. link. 이것은 사용자 정의 TableViewCell을 작성하는 매우 흥미로운 기사입니다. 오류는 Monotouch에서 제공 한 xib의 비동기 적 로딩 때문인 것 같습니다.

당신은 다음과 같이 자신의 costructor를 제공해야

:이 도움이

public TestCellView(string sKey) //: base(UITableViewCellStyle.Default, sKey) 
{ 
    MonoTouch.Foundation.NSBundle.MainBundle.LoadNib ("YOUR NIBNAME", this, null); 
} 

희망!

+0

여기서 제공 한 링크에 따르면 위에 입력 한 코드 예제가 올바르지 않습니다. 링크의 예제는 LoadNib을 ** 컨트롤러 ** 구현 내부에서 호출하며 셀 구현 내부에서는 호출하지 않습니다. –

3

Nib가로드 될 때까지 어떤 콘센트도 참조 할 수 없습니다. "NIB로드가 끝나면 필드에 액세스 할 수 있습니다"라는 메시지가 무시 될 수있는 방법이 있습니다. 그 시점까지, 그 객체들을 참조하는 것은 항상 null을 반환 할 것이다.

관련 문제