2011-09-01 7 views
1

내 애플 리케이션의 사용자 정의 셀이있는 테이블 뷰가 있으며 각 셀에는 두 개의 체크 박스 버튼이 있습니다.사용자 정의 셀이있는 테이블 뷰

스크롤 이벤트가 트리거되면 (위 또는 아래로) 테이블 뷰를 다시로드하는 것이 문제입니다. 따라서 체크 박스 버튼은 초기 상태가됩니다.

제게 해결책을주십시오.

고마워요

+0

셀에'dequeueReusableCellWithIdentifier' 메소드를 사용합니까? – beryllium

+0

예, dequeueReusableCellWithIdentifier를 사용하고 있습니다. 그럴까요? – sajaz

답변

0

데이터 소스의 버튼 상태를 설정하고 셀을 만들 때이 상태를로드해야합니다. 나는 이것을 보여주기 위해 small Xcode project이라고 썼다.

0

데이터 소스로 TableView를 사용하면 안됩니다.

셀이 표시 될 때마다 UITableViewDataSource에 indexPath로 UITableViewCell을 요청합니다.

- (void) tableView:(UITableView *)tableView setImage:(UIImage *)image forCellAtIndexPath:(NSIndexPath *)indexPath 

is 메서드에서 데이터 소스에 반영된대로 확인란 상태를 설정해야합니다. 확인란이 변경되면 선택한 상태로 데이터 소스에 저장합니다.

예 :

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellIdentifier = @"CheckedTableViewCell"; 

    CheckedTableViewCell *cell = (CheckedTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (!cell) { 
     [[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil]; 
     cell = (CheckedTableViewCell *)self.nibCell; 
     self.nibCell = nil; 
    } 

    item *item = [self objectAtIndexPath:indexPath]; 

    cell.titleLabel.text = item.title; 
    cell.switch.on = item.selected; 

    return cell; 
} 
+0

도움에 감사드립니다. 하지만이 문제를 사용할 때 if (! cell) { [[NSBundle mainBundle] loadNibNamed : cellIdentifier owner : self options : nil]; cell = (CheckedTableViewCell *) self.nibCell; self.nibCell = nil; } 왜냐하면 tabelview를 스크롤 할 때마다 체크 셀과 비슷한 새 셀을 생성하기 때문입니다. – sajaz

+0

nib의 'UITableViewCell'에 대해 cellIdentifier를 설정 했습니까? – rckoenes

0

당신이 바로 당신이 그것을 클릭하면 NSUserDefaults의 상태를 저장할 수 있습니다. 그냥 @selector(changedOne:)와 대상을 추가하고 무효 문을 추가 : 당신은 세포가 확인 여부를해야하는 결정하기 위해 목록을 직접 관리해야 할거야

- (void)changedOne: (id)sender { 
    NSUserDefaults *df = [NSUserDefaults standardUserDefaults]; 
    NSString *row = [NSString initWithFormat:@"toggleOneRow%i",indexPath.row]; 
    if (sender.on) { 
     [df setBool:YES forKey:row]; 
    } 
    else { 
     [df setBool:NO forKey:row]; 
    } 
} 
+0

이 대답은 유용한 정보가 조금 더 필요하다고 생각합니다. "대상을 추가하려면 어떻게합니까?"와 같은 세부 정보를 추가 할 수 있습니까? 또는 "일단이 정보가 설정되면 어떻게 사용합니까?" 기본적으로, 당신은 질문에 기초하여 OP의 Obj-C 기술 (자세한 설명없이)을 넘어서는 고급 개념을 사용하고 있다고 생각합니다. – mbm29414

1

. tableView:cellForRowAtIndexPath:에서 적절한 구현은 셀을 재활용하므로 10-15 개 이상의 셀을 인스턴스화 할 수 없습니다. 제대로 처리하지 않으면 펑키 한 결과가 발생할 수 있습니다. 열악한 구현을 수행했을 때 특정 셀 속성이 한 셀에서 다음 셀로 이어지는 것을 보았습니다.

어쨌든

, 여기에 내가 (당신이 요구하는지 무슨 생각을 기반으로) 권 해드립니다 내용은 다음과 같습니다
1. 결정하기 위해 해당 클래스의 속성을 만들고 각있는 UITableViewCell
2를 백업하는 클래스를 작성하는 두 개의 체크 박스 중 하나 (또는 ​​둘 다 또는 모두)가 점검되어야합니다.
3. ViewController/TableViewController에서 NSMutableArray/NSArray는 UITableView의 배열 = 1 셀에 1 개 항목을 유지 관리합니다.
4. tableView:cellForRowAtIndexPath: 메서드에서 배열의 해당 항목에 대한 참조를 가져옵니다.
5. 그런 다음 인스턴스의 속성을 확인하고 확인란 값을 적절하게 설정합니다.


샘플 코드 :

TableView.h

@interface TableView : UITableViewController 

@property (strong, nonatomic) NSMutableArray *itemArray; 

@end 

TableView.m

@implementation TableView 

@synthesize itemArray; 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Assume you get a valid, custom UITableViewCell at this point (named "cell") 

    // Configure the cell... 
    NSObject *classItem = [[self itemArray] objectAtIndex:[indexPath row]]; 
    [[cell checkBox1] setChecked:[classItem checkbox1Checked]]; 
    [[cell checkBox2] setChecked:[classItem checkbox2Checked]]; 

    return cell; 
} 

@end 
+0

귀하의 도움을 많이 주셔서 감사합니다, 사용자 정의 셀에 대한 별도의 클래스를 사용하여. 내 cellForRowAtIndexPath : (NSIndexPath *) indexPath 메서드는 다음과 같습니다. NSString * CustomCellIdentifier = @ "CustomCellIdentifier"; \t CustomCell * cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier : CustomCellIdentifier]; \t \t 경우 (셀 == 닐) { \t \t NSArray를 펜촉 * = [NSBundle mainBundle] loadNibNamed : 자기 선택해주세요 "CustomCell" 오너 @ 닐]; \t \t (id oneObject in nib) if ([oneObject isKindOfClass : [CustomCell class]]) \t \t \t cell = (CustomCell *) oneObject; \t} – sajaz

0

당신은 cellForRowAtIndexPath을 사용하고 있습니다.예, 당신이 취할 수있는 대신

static NSString [email protected]"CellIdentifier" 

사용

NSString *CellIdentifier=[NSString [email protected]"CellIdentifier%d",indexPath.row]; 

다른 접근 방식은 tag.initially 당신이 설정할 수 checkboxbuttons에 태그를 지정하고 AppDelegate에 파일에 하나 개의 사전을 가지고 체크 박스 값을 설정하는 경우 checked 또는 unchecked.and cellforrowatindexpath 메소드에서 값을 설정하십시오. appdelegate dictionary에 따라 확인란의 값을 설정하고 사용자가 버튼을 선택하거나 선택 취소 할 때 Appdelegate 사전에서 상태를 업데이트합니다.

+0

안녕하세요,이 사용의 효과가 무엇인지 이해할 수 없으므로 알려 주시기 바랍니다. 덕분에 많이 – sajaz

+0

당신은 이것을하지 말아야한다, 이것은 TableView가 매우 느리게 반응하게 할 것이고, 스크롤은 지연 될 것이다. – rckoenes

+0

정적 CellIdentifier를 사용하는 경우이 식별자는 다음 행에 사용됩니다.하지만 % d를 지정하면 각 행마다 다른 식별자가 만들어집니다.하지만 rckoess에 따르면 스크롤 속도가 느려집니다. – Bhoomi

관련 문제