gpt4 book ai didi

ios - 自定义 TableViewCell - 与 TableViewController 通信

转载 作者:行者123 更新时间:2023-11-28 22:30:51 27 4
gpt4 key购买 nike

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

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

最佳答案

一个好方法是使用自定义单元格类。让该单元类管理按钮及其对用户交互的 react 。单元格应提供一个属性来保存标识信息(您在 tableView:cellForRowAtIndexPath: 中配置)。单元格还应提供传递单元格本身的回调(以便您可以获得标识信息并更改单元格的任何属性)和选择状态。类似于 customCell:didUpdateSelectionState:

只是在按钮上设置标签(同样在tableView:cellForRowAtIndexPath:)然后当你得到按钮事件(flagLectureButtonPressed,现在在 Controller 而不是单元格中处理)你可以获得标签号。


对于回调,您有 2 个级别的复杂性:1. 选择器。 2. 协议(protocol)。选择器选项很简单,但提供的编译器验证或参数选项很少。协议(protocol)方法稍微复杂一点,但验证性更好,也更灵活。

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)(用合理的名称替换 ...):

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

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

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

然后,当点击按钮时:

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

关于ios - 自定义 TableViewCell - 与 TableViewController 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17503314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com