0

나는 사용자 정의 된 UIView, MyView를 가지고 있는데,이 테이블 뷰에는 tv1과 tv2가 프로그래밍 방식으로 추가되어 있습니다.ViewController는 사용자 정의보기의 테이블 뷰의 위임자로

loadView에서 MyView의 인스턴스를 만드는 MyController 사용자 정의 UIViewController가 있습니다.

내 목표는 다음과 같습니다. myView는 데이터 모델에 접촉하지 않고 정적이기 때문에 myView.tv1에 대한 데이터 소스 및 위임자 여야합니다.

myController는 myView.tv2의 위임이어야합니다. 그 내용은 데이터 소스에 따라 달라지기 때문입니다.

@interface MyController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

@interface MyView : UIView <UITableViewDelegate, UITableViewDataSource> 

를 각각 필요한 대리자 메서드에 추가 :

나는 각 헤더에 다음을 추가했습니다.

MYVIEW의 init에서

, 그 테이블보기를 추가, 자기에 대한 첫 번째의 위임 설정 :

tv1 = [[UITableView alloc] initWithFrame:frame1 style:UITableViewStyleGrouped]; 
tv1.delegate = self; 
tv1.datasource = self; 

tv2 = [[UITableView alloc] initWithFrame:frame2 style:UITableViewStyleGrouped]; 

을 그리고 내 컨트롤러에서 나는 두 번째의 tableview 연결할 :

- (void)loadView{ 
self.view = [[MyView alloc] initWithFrame:myFrame]; 
[(MyView *)self.view tv2].delegate = self; 
[(MyView *)self.view tv2].dataSource = self; 
} 

을 이걸 실행하면 런타임 오류가 완전히 엉망이됩니다. 때로는 페이징 제어에 대해 불평하고, 다른 경우에는 NSCFArray를, 다른 경우에는 텍스트를 전혀 쓰지 않습니다. 항상 충돌합니다.

위임자가 아니라 문제를 일으키는 데이터 소스를 설정하고 있다고 판단했습니다. laodView에서 데이터 소스 라인을 주석 처리하면 괜찮습니다 (물론 내용은 없음).

매번 다른 런타임 오류가 발생할 수 있으며 어디에서 잘못 될 수 있습니까?

+1

일반적으로 (내 경험상) 다양한 충돌 오류 메시지를받는 것은 메모리와 관련이 있습니다. 테이블 뷰 중 하나의 구현을 주석 처리하고 한 번에 하나씩 작동 시키려고 했습니까? 어떤 tableview (또는 어느 쪽)가 문제인지를 좁힐 수 있다면 문제를 파악하는 데 도움이 될 것입니다. – WendiKidd

+0

@WendiKidd의 설명을 보완하려면 정적 분석기를 실행하면 도움이되는지 확인하십시오. – Danra

+0

고마워요 - "[ numberOfSectionsInTableView :] : 인식 할 수없는 셀렉터가 보냈습니다"라는 메시지가 나타납니다. 공란은 __NSCFType, NCSFArray 등입니다. ARC를 사용하기 때문에 어디에서 시작해야할지 모르겠습니다. –

답변

0

MYVIEW는 내 데이터 모델에 접촉하지 않기 때문에, myView.tv1에 대한 데이터 소스 위임하고 정적한다

그건 아니에요 정말 MVC, 맞죠?

각 테이블마다 별도의 조합 된 대리자 & 데이터 소스 클래스를 준비하면 문제를 더 빠르게 (또는 쉽게 피할 수있을 것입니다) 생각합니다. table1 데이터 소스는 MyView의 내부 클래스 일 수 있습니다.

테이블 소유자가 보유한 대리자/데이터 소스 참조를 유지하는 것이 매우 중요합니다 (테이블 1에 대해 대리자/데이터 소스를 self으로 설정할 때 그다지 중요하지 않을 수 있습니다. MyView) 및 table2 (MyController)를 사용하지만 별도의 대리자 & 데이터 소스 클래스를 만드는 경우이 점을 명심해야합니다. 어쨌든 array을 데이터 소스로 사용하고 있어야합니다.

+0

감사합니다. 어떻게 테이블 뷰를 유지할 수 있습니까? ARC를 사용하고 있습니다. MVC에 관해서는, 그것이 내가 tv2에 대한 델리게이트/데이터 소스를 별도로 관리하고있는 주된 이유입니다. tv1은 단순히 같은 뷰 내의 버튼 누름에 기반한 디스플레이를 업데이트합니다. 어떤 데이터 객체에 대한 참조도 없습니다.이 코드는 뷰를 연결하는 컨트롤러와 상관없이 항상 같을 것입니다. 컨트롤러가 왜 책임을 져야합니까? 그것? –

+0

ARC를 사용하지 않지만 속성 소유권 (@property (strong, nonatomic) NSObject * myString;)을 취하려면 ARC를 작성해야한다는 강력한 인수 여야합니다. 'table1' 델리게이트에 관해서는,'MyController'에서 언급 한 것을 의미하는 것은 아니며, 인터페이스를 선언하고 MyView.m에서 구현체를 작성하고, 인스턴스를 생성하고, 유지하고, 설정할 수 있습니다 'table1'의 델리게이트입니다. 'Table1' 초기화는'MyView.h'에 선언 된'MyView' 메쏘드에서 래핑되어'MyController'가 델리게이트에 대해 아무것도 알지 못하게 할 수 있습니다. –

+0

우리는 전선을 교차 시켰을 수 있습니다 - tv1은 MyView 내부에 완벽하게 구축되고 제어됩니다. MyController는 tv2에 대해서만 알고 있습니다. 지금은 tv2를 정의하는 속성을 사용하지 않습니다. –

관련 문제