2013-07-06 4 views
0

상태가 지속되는 것으로 간주되는 확인란이있는 사용자 지정 TableViewCell이 있습니다. 내 문제는 어떻게 TableView 사용자 지정 셀, 사용자가 어떤 TableView 행 단추를 눌렀는지 알고 싶습니다 단추를 누를 때 개체를 저장할 때 전달할 수 및 그것을 전달할 수 있어야합니다. 키를 TableView에서 NSUserDefaults 키에 사용하십시오. 어떻게해야합니까?사용자 지정 TableViewCell - TableViewController와 통신

- (IBAction)flagLectureButtonPressed:(UIButton *)sender 
{ 
    NSLog(@"sender %@",sender.description); 
     UIImage* selectedButton=[UIImage imageNamed:@"checkmarkSelected.png"]; 
     UIImage* unselectedButton=[UIImage imageNamed:@"checkmark.png"]; 

     if (sender.currentImage == unselectedButton) { 
      [sender setSelected:YES]; 
      [sender setImage:selectedButton forState:UIControlStateNormal]; 
      [self saveflagButtonState:kButtonFlagged forButton:sender]; 
     } else { 
      [sender setSelected:NO]; 
      [sender setImage:unselectedButton forState:UIControlStateNormal]; 
      [self saveflagButtonState:kButtonNormal forButton:sender]; 
     } 
} 

- (void) saveflagButtonState:(ButtonState)state forButton: (UIButton *)sender 
{ 
    static int i = 0; 
    NSString *object; 
    if (state == kButtonFlagged) { 
     object = @"flaged"; 
    } else if (state == kButtonNormal) { 
     object = @"normal"; 
    } 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:object forKey:@"key"]; 
    [defaults synchronize]; 
} 

- (void) setTagLectureButton:(UIButton *)tagLectureButton 
{ 

    UIImage* selectedButton=[UIImage imageNamed:@"checkmarkSelected.png"]; 
    UIImage* unselectedButton=[UIImage imageNamed:@"checkmark.png"]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *buttonIsTaged = [defaults stringForKey:@"key"]; 
    if (buttonIsTaged) { 
     [tagLectureButton setImage:selectedButton forState:UIControlStateNormal]; 
    } else { 
     [tagLectureButton setImage:unselectedButton forState:UIControlStateNormal]; 
    } 
} 

@end 

답변

2

좋은 방법은 사용자 지정 셀 클래스를 사용하는 것입니다. 해당 셀 클래스에서 단추를 관리하고 사용자 상호 작용에 반응하는 방식을 지정하십시오. 셀은 (tableView:cellForRowAtIndexPath:에서 구성하는) 식별 정보를 보유하는 등록 정보를 제공해야합니다. 셀은 셀 자체를 전달하는 콜백을 제공해야합니다 (즉, 식별 정보를 가져와 셀의 속성을 변경할 수 있음) 및 선택 상태. customCell:didUpdateSelectionState:과 같은 것입니다.

단지 (다시 tableView:cellForRowAtIndexPath:에서) 버튼에 tag를 설정하고 버튼 이벤트 (flagLectureButtonPressed, 지금 대신 셀의 컨트롤러에서 처리)를 얻을 때 다음 태그 번호를 얻을 수있는 아주 좋은하지 방법 .


콜백의 경우 두 가지 수준의 복잡성이 있습니다. 1. 선택 도구. 2. 프로토콜. 선택기 옵션은 간단하지만 매개 변수에 대한 컴파일러 확인 또는 옵션은 거의 제공하지 않습니다. 프로토콜 방법은 좀 더 복잡하지만 검증과 유연성이 뛰어납니다.

@property (weak, nonatomic) id selectionTarget; 
@property (assign, nonatomic) SEL selectionAction; 

그리고 당신은 올바른 형식 선택을 공급 (코드를 유지하는 미래에 또는 사람) 자신에 의존 : 휴대 서브 클래스에서

1.

은 2 곳이 추가됩니다. 그리고, 버튼을 태핑하는 경우 :이 경우는 selectionStateNSNumber/NSString/등 (오브젝트 아닌 정수) 인 것을

[self.selectionTarget performSelector:self.selectionAction withObject:self withObject:selectionState]; 

참고. 언제 그런

@property (weak, nonatomic) id <...CellDelegate> selectionDelegate; 

:

@protocol ...CellDelegate 
- (void)customCell:(... *)cell didUpdateSelectionState:(ButtonState)state; 
@end 

그런 다음 셀에 1 개 속성을 추가 :

2.

당신은 프로토콜 (재치있는 이름을 가진 ... 교체)를 정의 버튼을 탭하면 :

[self.selectionDelegate customCell:self didUpdateSelectionState:selectionState]; 
+0

위대한 당신이 염두에 두었던 콜백의 예 - 나는 이것에 대해 아주 새롭다. –

+0

좋아요! 고마워요! –

관련 문제