【问题标题】:Custom TableViewCell - Communicating with TableViewController自定义 TableViewCell - 与 TableViewController 通信
【发布时间】:2017-10-08 22:06:18
【问题描述】:

我有一个自定义 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

【问题讨论】:

    标签: ios uitableview


    【解决方案1】:

    一个好方法是使用自定义单元格类。让该单元类管理按钮及其对用户交互的反应。单元格应提供一个属性来保存标识信息(您在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];
    

    【讨论】:

    • 如果有一个你想到的回调示例会很棒 - 我对此很陌生。
    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多