2013-05-07 2 views
0

사용자 정의 논리를 포함하는 UITableView에서 파생 클래스를 만들었습니다. 그러나 세포를 채우는 방법을 잘 모르겠습니다.사용자 정의 클래스가있는 UITableView

h. 파일 :

@interface MetricsView : UITableView { 
    @private 
    NSMutableArray *_items; 
} 
@end 

m. 파일 :

@implementation MetricsView 

    //this gets called 
    - (id)initWithCoder:(NSCoder *)aDecoder 
    { 
     self = [super initWithCoder:aDecoder]; 
     if (self) { 
      _items = [[NSMutableArray alloc]initWithObjects:@"Name:", nil]; 
     } 
     return self; 
    } 

//this never gets called?? 
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    { 
     return 1; 
    } 

    //this never gets called?? 
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
     return [_items count]; 
    } 

//this never gets called?? 
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     NSString *cellIdentifier = @"MetricsViewCell"; 

     MetricsViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

     [cell setupWithName:[_items objectAtIndex:0] withData:[_items objectAtIndex:0]]; 
     return cell; 
    } 

    @end 

나는 내 ViewController 위에 MetricsView를 만들었습니다. 다음과 같은 모습을 스토리 보드 작업은 다음과 같습니다

Here's what storyboard looks like:

내가 ViewController.m 내부에 일부 사용자 지정 초기화 코드를 추가해야합니까?

감사합니다.

답변

1

글쎄요. UITableView이보기입니다. 실제로 서브 클래스를 작성할 수는 있지만 원하는대로되지는 않습니다. 내 생각에 사용자 정의 UITableViewdelegatedataSource을 만드는 것이 좋습니다. 이 두 프로토콜을 따르는 사용자 정의 클래스를 의미합니다. UITableView를 하위 클래스로 만들 필요는 없지만 사용자 정의 클래스를 UITableView의 대리인으로 설정해야합니다. 그리고이 클래스에서 구현하려는 메소드 (인덱스 경로의 행에 대한 셀, 섹션의 행 수, 섹션 수)를 구현할 수 있습니다. 필요한 것은 테이블 뷰에서 물을 얻을 수있는 우물을 서브 클래스로 만드는 것입니다 (물은 셀에 넣을 내용과 생성 할 셀 수에 대한 정보 임). 이게 도움이되기를 바랍니다!

+0

지금 고맙다고 생각합니다. –

+0

그래서 "객체에 대한 malloc : *** 오류가 발생했습니다 : 0x75610453 : 할당 해제 된 포인터가 해제되었습니다.*** setDataSource를 호출 한 후"디버깅을 위해 malloc_error_break에 중단 점을 설정하십시오. " My MetricsView는 더 이상 사용자 정의 클래스가 아니며 단지 기본 UITableView입니다. metricsView를 직접 호출해야합니까? –

+0

모두 지금 고맙다! –

1
//this never gets called?? 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 

그 다른 방법 데이터 소스 방법이다. 이 클래스를 테이블 뷰의 데이터 소스로 설정하지 않으면 호출되지 않습니다.

이상하게도이 코드를 UITableView 하위 클래스 자체에 넣었습니다. 좋아요, 이상하네요. MVC에 위배됩니다.하지만 정말로 원한다면 할 수 있습니다. 그런 다음 UITableView 하위 클래스를 고유 한 데이터 소스로 설정해야합니다 (아마도 자체 대리자). 그것은 그 자체로 모든 일이 일어나지 않을 것입니다. 당신은 그것을해야합니다.

그러나 일반적으로 나는 처음부터 UITableView를 서브 클래 싱 (subclassing) 할 필요성과 바람직성에 의심을 던지곤했다. 이 일이 유용 할 수있는 상황을 생각하기가 어렵습니다. 인터페이스에 테이블보기를 놓고 delegatedatasource 콘센트를 View Controller에 연결하기 만하면됩니다. 이제 뷰 컨트롤러는 numberOfSectionsInTableView: 및 기타 호출을받습니다.

+0

나는 그가 아직 UITableView 서브 클래스와 델리게이트/데이터 소스의 차이점을 이해하지 못했다고 생각한다. –

+0

@ Nicolas 나는 그것을 모호하게 이해한다. Objective C를 배우기 시작했습니다. –

+0

를 MetricsView 인터페이스에 추가 한 다음 어떻게 든 스토리 보드를 통해 링크합니까? –

관련 문제