gpt4 book ai didi

ios - UITableView 错误中的 UISwitch

转载 作者:行者123 更新时间:2023-11-28 22:08:48 25 4
gpt4 key购买 nike

我的 UITableViewCell 原型(prototype)中有一个 UISwitch。

问题是,当我打开其中一个开关时,未显示的开关之一也会打开。

在显示所有单元格的 iPad 版本中不会发生这种情况。

这是一些代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

Notification *notification = [notifications objectAtIndex:indexPath.row];

UILabel *titleLabel = (UILabel *) [cell viewWithTag:100];
UISwitch *newsSwitch = (UISwitch *) [cell viewWithTag:101];
UIImageView *imageView = (UIImageView *) [cell viewWithTag:102];

[titleLabel setText:[notification name]];
[imageView setImage:[UIImage imageNamed:[notification image]]];

BOOL isOn = [storage boolForKey:[NSString stringWithFormat:@"notification_%@", [notification name]]];
[newsSwitch setOn:isOn];
[newsSwitch setTag:indexPath.row];
[newsSwitch addTarget:self action:@selector(didChangeStateForSwitch:) forControlEvents:UIControlEventValueChanged];

return cell;
}

最佳答案

你的问题是你首先通过它的标签查询开关:

UISwitch *newsSwitch = (UISwitch *) [cell viewWithTag:101];

但稍后,您更改了该标签:

[newsSwitch setTag:indexPath.row];

因此,当单元格被重用时,将找不到开关,因为现在它的标签不再是 101。因此,开关将停留在其旧状态。

您可以通过在查询开关后添加 NSLog(@"Switch: %@", newsSwitch); 轻松验证这一点。您会看到它会为您具有“错误”开关值的那些行输出 Switch: (null)

解决方法是不修改标签。

问题是,您如何记住开关对应的行?一种方法是这样的:

- (void)didChangeStateForSwitch:(id)sender
{
NSIndexPath *indexPath = [myTableView indexPathForCell:[sender superview]];
...
}

另一种可能性是使用 associated objects .

关于ios - UITableView 错误中的 UISwitch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361533/

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