2013-07-06 10 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:.

Не очень хороший способ это просто установить tag на кнопку (снова в tableView:cellForRowAtIndexPath:), а затем, когда вы получаете событие кнопки (flagLectureButtonPressed, теперь обрабатываемая в контроллере вместо ячейки) вы можете получить номер тега ,

Для обратного вызова у вас есть 2 уровня сложности: 1. Селектор. 2. Протокол. Опция селектора проста, но предлагает небольшую проверку компилятора или параметры параметров. Метод протокола немного сложнее, но лучше проверен и более гибкий.

1.

В своем мобильном подклассе добавлены 2 свойства:

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

И полагаться на себя (или кого-либо в будущем, сохраняя свой код) для обеспечения правильного выбора формата. Затем, когда кнопка сливают:

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

Обратите внимание, что selectionState в этом случае является NSNumber/NSString/и т.д. (объект, не является целым числом).

2.

Вы определяете протокол (замена ... с разумными названиями):

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

Затем добавьте 1 свойство в ячейке:

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

Тогда, когда кнопка зажимается:

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

Было бы здорово wi й пример обратного вызова, который вы имели в виду - я совершенно новичок в этом. –

+0

Отлично! Большое спасибо! –

Смежные вопросы