gpt4 book ai didi

ios - UITableView中的UISwitch出现奇怪的显示问题

转载 作者:行者123 更新时间:2023-12-01 18:13:44 25 4
gpt4 key购买 nike

我正在使用下面的代码将UISwitch添加到UITableView单元格,但是出现了一个奇怪的显示问题。出现此问题似乎是因为我定期自动刷新TableView,从而重新创建了UISwitch。

图片最好显示正在发生的事情。

像这样开始:

变成这样:


顶部开关已打开和关闭。进入这种状态(带有黑色绒毛)需要花费几分钟,但是只要打开并关闭UISwitch,就可以看到问题。

这是代码:-

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

//Includes code that also adds a UITextView and a UIImageView, but these do not have issues.

UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectMake(10, 5.0, 60.0, 50.0)];
[switchView addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventValueChanged];

[cell.contentView addSubview:switchView];

return cell;

最佳答案

每次加载单元时,您都将添加一个新的开关。您所看到的是许多交换机相互堆叠。

同样,为您的开关设置的目标操作不会通过选择器名称建议的索引路径。当我不想对单元格进行子类化时,通常会使用此解决方案。 Getting data from a textfield inside a prototype uicollectionviewcell

可能的解决方案:使用关联的对象来跟踪您的开关。

static NSString *kIndexPathKey = @"indexPathKey";
static NSString *kSwitchViewKey = @"switchViewKey";

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectMake(10, 5.0, 60.0, 50.0)];
[switchView addTarget:self action:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged];
[self addSwitchView:switchView toCell:cell];
}

UISwitch *switchView = [self switchViewForCell:cell];
[self setIndexPath:indexPath onSwitch:switchView];
switchView.on = [self isIndexPathSelected:indexPath];

return cell;
}

- (void)addSwitchView:(UISwitch *)switchView toCell:(UITableViewCell *)cell {
[cell.contentView addSubview:switchView];
[cell setAssociatedObject:switchView forKey:kSwitchViewKey];
}

- (UISwitch *)switchViewForCell:(UITableViewCell *)cell {
return [cell associatedObjectForKey:kSwitchViewKey];
}

- (void)switchValueChanged:(UISwitch *)sender {
NSIndexPath *indexPath = [self indexPathOfSwitch:sender];
[self setRowSelected:sender.isOn atIndexPath:indexPath];
[self.delegate didSelectItem:[self itemAtIndexPath:indexPath] atIndexPath:indexPath selected:sender.isOn sender:self];
}

- (void)setIndexPath:(NSIndexPath *)indexPath onSwitch:(UISwitch *)switchView {
[switchView setAssociatedObject:indexPath forKey:kIndexPathKey];
}

- (NSIndexPath *)indexPathOfSwitch:(UISwitch *)switchView {
return [switchView associatedObjectForKey:kIndexPathKey];
}
@implementation NSObject (AssociatedObjects)

- (void)setAssociatedObject:(id)object forKey:(NSString *const)key {
objc_setAssociatedObject(self, (__bridge const void *)(key), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (id)associatedObjectForKey:(NSString *const)key {
return objc_getAssociatedObject(self, (__bridge const void *)(key));
}

@end

请注意,以上所有使用关联对象的操作都可以通过使用 UITableViewCell的自定义子类来完成。但是,不进行子类化有很多优点。

组成>继承。

关于ios - UITableView中的UISwitch出现奇怪的显示问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25021983/

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