2013-04-26 3 views
-1

UITableViewCell 안에 내 UISwitch에 문제가 있습니다. 한 스위치의 값을 변경 한 다음 위로 또는 아래로 스크롤하면 모든 스위치가 엉망입니다. 배열을 사용하여 재사용 성으로 인해 각 스위치의 상태를 저장할 때마다 매번 엉망이됩니다.위 또는 아래로 스크롤 할 때 uitableviewcell의 Uiswitch가 재설정됩니까?

-(void)switchChanged:(UISwitch *)sender 
{ 
    UITableViewCell *cell = (UITableViewCell *)[[sender superview] superview]; 
    NSIndexPath *index=[mainTableView indexPathForCell:cell]; 

    if (sender.on) 
    { 

     [[self.SwitchArray objectAtIndex:index.section] replaceObjectAtIndex:index.row withObject:@"ON"]; 
     NSString *word= [[self.mainArray objectAtIndex:index.section ] objectAtIndex:index.row]; 

    } 
    else 
    { 
     //call the first array by section 
     [[self.SwitchArray objectAtIndex:index.section] replaceObjectAtIndex:index.row withObject:@"OFF"]; 
     NSString *word= [[self.mainArray objectAtIndex:index.section ] objectAtIndex:index.row]; 

    } 

    [padFactoids setObject:[NSKeyedArchiver archivedDataWithRootObject:SwitchArray] forKey:@"savedArray"]; 
    [padFactoids synchronize]; 

} 

내가 너무 많은 도움을 주셔서 감사합니다 :

여기
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 


    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:@"Cell"]; 

    } 

    UISwitch *switchController = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    CGRect switchFrame = switchController.frame; 
    [switchController setOn:YES animated:NO]; 
    //set its x and y value, this you will have to determine how to space it on the left side 
    switchFrame.origin.x = 50.0f; 
    switchFrame.origin.y = 10.0f; 
    switchController.frame = switchFrame; 


    [switchController addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 
    [cell addSubview:switchController ]; 

    UILabel *label ; 

    label=(UILabel *)[cell viewWithTag:1]; 
    NSString *value = [[mainArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
    label.text = value; 
    label.textAlignment = NSTextAlignmentRight; 
    label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; 


    //This for persist switch state when scroll up or down 
    if ([[[self.SwitchArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row ]isEqualToString:@"ON"]) 
    { 
     switchController.on=YES; 


    } 
    else 
    { 
     switchController.on=NO; 


    } 

     return cell; 
} 

이 SwitchChanged 이벤트 :

여기 cellForRowAtIndexPath 방법이다.

+0

중단 점을 설정하고'self.SwitchArray'를보고 그것이 존재하는지 ('nil'이 아니라는) 확인하고 예상 한 데이터를 포함하는지보십시오. 짐작할 수 있듯이, 여러분의 배열은'nil'이므로 항상 꺼져있는 스위치가 돌아옵니다. 귀하의 답변에 대해 당신보다 @@@ – DBD

+0

입니다. 하지만 모든 스위치가 꺼져있는 것은 아닙니다. 나는 테이블 뷰의 스위치 중 하나를 바꿀 때마다 위 또는 아래로 스크롤하여 스위치가 켜져 있고 부통령이 될 때까지 엉망이된다. – user2323070

+0

ChrisH가 언급했듯이, 스위치가 이미 존재하는 경우에도 셀을 구성 할 때마다 새로운 'UISwitch'를 생성하게됩니다. 그게 바로 고쳐야 할 것이지만, 데이터 모델을 확인해야 할 필요가 있다고 생각합니다. 나는 당신의 가치가 자신이 생각하는 것처럼 절약되고 있다고 확신하지 않기 때문입니다. – DBD

답변

0

이것이 문제의 원인인지 여부는 확실하지 않지만 다른 관련 문제가 발생할 수 있습니다.

셀이 화면 밖으로 이동하고 다음 셀이 표시 될 때마다 화면에서 방금 이동 한 셀이 다시 사용됩니다. 하지만 셀에 매번 새 스위치 개체를 추가해야합니다. cell==nil 블록 내에서만 생성하는 것이 훨씬 낫습니다. 태그를 지정하고 태그를 사용하여 lable 객체와 같이 재사용 할 때 객체를 가져옵니다.

+0

고맙습니다. 도움이되었습니다.하지만 이제는 내 테이블에 많은 섹션이 있고, 섹션 0 행 0이 변경 될 때마다 많은 행이있는 새로운 문제가 발생합니다. 모든 섹션의 행 0이 변경 되었습니까? 왜 이런 일이 일어나는 지 아십니까? – user2323070

0

tableView에서 셀을 요청할 때마다 새 스위치를 만듭니다. 당신은 각 셀에 대해 한 번 스위치를 만들려면 :

UISwitch *switchController; 

if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:@"Cell"]; 

    switchController = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    CGRect switchFrame = switchController.frame; 
    [switchController setOn:YES animated:NO]; 
    //set its x and y value, this you will have to determine how to space it on the left side 
    switchFrame.origin.x = 50.0f; 
    switchFrame.origin.y = 10.0f; 
    switchController.frame = switchFrame; 

    [switchController addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 
    [cell.contentView addSubview:switchController ]; 

    switchController.tag = 123; //Arbitrary number...can be anything 
} 
else { 
    switchController = (UISwitch *)[cell.contentView viewWithTag:123]; 
} 

//Now set the switch state according to your data model array 

그것은 일반적으로 세포 자체보다는 셀의있는 contentView에 하위 뷰를 추가하는 좋은 습관이다.

+0

어떻게 그렇게 할 수 있는지 자세히 알려주십시오. 이것은 나를 많이 도울 것입니다. 감사합니다. – user2323070

+1

좋은 조언. 새 스위치를 할당 할 때 너무 많은 "="가 하나 있습니다. 그리고 나중에 값을 설정할 때'[switchController setOn : YES animated : NO];를 호출 할 필요가 없습니다. –

+0

@HermannKlecker 예'= ='는 제 입력 오류입니다.'switchController setOn : YES animated : NO];' – ChrisH

1

헤더 파일에 NSMutableArray를 선언하고 이름을 switchStates으로 지정합시다.

NSString *theSwitchPosition = [NSString stringWithFormat:@"%@", switchControl.on ? @"ON" : @"OFF"]; 
[switchStates replaceObjectAtIndex:aPath.row withObject:theSwitchPosition]; 

: 스위치가 트리거 될 때 실행 당신의 방법에서

switchStates = [[NSMutableArray alloc] init]; 
for (int i; i <= switchesArray.count; i++) { 
    [switchStates addObject:@"OFF"]; 
} 

: 당신의 viewDidLoad에서

, 스위치의 수에 따라 메모리를 할당하고 문자열 "OFF"로 개체를 추가 그 후에 스위치를 만드는 방법에서 :

if ([[switchStates objectAtIndex:indexPath.row] isEqualToString:@"ON"]) { 
    mySwitch.on = YES; 
} else { 
    mySwitch.on = NO; 
} 

이 w orked for me, 행운을 빌어 요.

관련 문제