0

我有一个自定义 TableViewCell,它有一个状态应该保持不变的复选框。我的问题是如何让 tableView 与自定义单元格通信,例如,当我在用户按下按钮时存储对象时,我需要知道用户按下按钮的 TableView 行,并且我需要能够将其传递给用于 NSUserDefaults 键的 TableView 中的键。我该怎么做呢?

- (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
4

1 回答 1

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// NSStringetc(一个对象,而不是一个整数)。

2.

您定义一个协议(用合理的名称替换 ...):

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

然后向单元格添加 1 个属性:

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

然后,当点击按钮时:

[self.selectionDelegate customCell:self didUpdateSelectionState:selectionState];
于 2013-07-06T13:24:02.467 回答