- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 UITableView
,其中每个单元格都包含一个 UISwitch
。该开关应该将单元格中命名的内容切换为事件或不活动,并且当用户切换开关时它可以完美地工作。
然而,当整个表格行被选中时,我想到了也进行切换的好主意。理论上很简单吧?在更新数据模型方面确实如此。
但是,无论出于何种原因让我在过去的 2 小时内感到困惑,当我重新加载表数据时,只有单元格 #3 中的开关更新以反射(reflect)状态变化。无论表格中有多少行,始终只有第三个单元格有效。如果少于 3 个单元格,则没有单元格工作。
我已经在其中转储了大量的 NSLog
调用,它们反射(reflect)了我一直期望的正确数据状态,但它们只是没有反射(reflect)在开关之外第一次加载。如果我离开 View Controller 然后回来,开关都已正确设置...
我只知道这将是我在某个地方做过的一些愚蠢的事情,因为它只在一个实例中起作用,但在我的一生中我看不到它:(
可以吗?
-(void)viewDidLoad
{
[super viewDidLoad];
[_tableAddPeople setDelegate:self];
[_tableAddPeople setDataSource:self];
}
-(void)viewWillAppear:(BOOL)animated
{
[_tableAddPeople reloadData];
}
-(void)listSwitchChanged:(id)sender
{
UISwitch * switchControl = sender;
Person * person = [SAVE_DATA getPersonWithIndex:(int)switchControl.tag];
if (switchControl.on)
{
[SAVE_DATA activePeopleAdd:person.tag];
}
else
{
[SAVE_DATA activePeopleRemove:person.tag];
}
}
#pragma mark UITableViewDataSource Delegate
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [SAVE_DATA peopleCount];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell * cell = [_tableAddPeople dequeueReusableCellWithIdentifier:@"AddPeopleCell"];
UILabel * nameLabel = (UILabel *)[cell.contentView viewWithTag:1];
UISwitch * activeSwitch = (UISwitch *)[cell.contentView viewWithTag:2];
Person * person = [SAVE_DATA getPersonWithIndex:(int)[indexPath row]];
[nameLabel setText:[person name]];
BOOL active = [SAVE_DATA activePeopleContains:person.tag];
NSLog(@"Row for %@ is %@", person.name, (active? @"ON" : @"OFF"));
[activeSwitch setOn:active animated:YES];
[activeSwitch addTarget:self action:@selector(listSwitchChanged:) forControlEvents:UIControlEventValueChanged];
activeSwitch.tag = (int)[indexPath row];
return cell;
}
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}
#pragma mark UITableView Delegate
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Person * person = [SAVE_DATA getPersonWithIndex:(int)[indexPath row]];
if ([SAVE_DATA activePeopleContains:person.tag])
{
NSLog(@"Removing %@", person.name);
[SAVE_DATA activePeopleRemove:person.tag];
}
else
{
NSLog(@"Adding %@", person.name);
[SAVE_DATA activePeopleAdd:person.tag];
}
[_tableAddPeople reloadData];
//dispatch_async(dispatch_get_main_queue(), ^{[tableView reloadData];});
}
最佳答案
您的问题是您将 switch tag
属性用于两件事:
因为您正在将 indexPath.row
分配给 tag
,如果索引路径不是 2(即第三行),[cell .contentView viewWithTag:2];
将在单元格被重新使用时返回 nil
。
您还遇到了单元重用的问题,因为您要多次添加切换操作处理程序。
我建议您采用以下方法:
使用属性公开单元格的 subview 并将 dequeueReusableCell
的结果转换为您的 UITableViewCell
子类,以便您无需使用标签即可访问它们
将您的 UITableViewCell
子类设置为切换操作处理程序。
在单元格和 View Controller 之间实现委托(delegate)模式,以便单元格可以通知 View Controller 开关已更改。单元格可以将 self
传递给委托(delegate)方法。在委托(delegate)方法中,您可以使用 indexPathForCell
来确定受影响的行。
不要仅仅因为一行发生了变化就重新加载整个 TableView 。仅重新加载受影响的行。
关于ios - 包含 UISwitch 的 UITableView 单元格更新不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53272638/
案例:我有 2 个 UISwitch - Switch1 和 Switch2。Switch1 控制场景中 UILabel 的可见性。Switch2 激活后关闭 Switch1 及其可见性。 问题:激活
我基本上有两个切换按钮,我希望用户从两个播放器或组播放中进行选择。但是,我不希望用户能够在用户单击其中一个时理想地选择这两个,而另一个则关闭。如何最好地实现这一点? -(void)stateSwi
我正在开发一个应用程序,其中有一个 UISwitch(switch1) 控制其他 UISwitches(开关 2-5)。如果开关 1 打开,则开关 2-5 关闭并禁用。如果 switch1 关闭,sw
我在同一 View 上有多个 UISwitch。在我的表单上,我需要使用 UISwitch 像单选按钮(网络)。不能同时打开超过一个 UISwitch,我只需要一个。 如果一个 UISwitch 打开
我有 11 行或更多行。只需要在第一个单元格中创建一个 UISwitch。当我单击任何行时,UIswitch 会重复。 UITableViewCell *cell = [tableView dequ
我在 PFTableView 中使用 UISwitch。当我打开一个 UISwitch 时,它会触发不同单元格中的另一个开关。下面是 PFTableViewCell 的代码。 override fun
我有一个 UITableView,其中我以编程方式为某些单元格添加了一个 UISwitch 作为 accessoryView。对于委托(delegate)方法didSelectRowAtIndexPa
如何获取给定 iOS 的默认 UISwitch 缩略图图像/阴影等?我正在构建自己的自定义 UISwitch,并希望我创建的拇指 ImageView 看起来与默认 UISwitch 相同。 最佳答案
我有两个 UISwitch....当第二个打开时我需要关闭第一个当第二个关闭时也打开第一个...... 同样,当第一个打开时,第二个将关闭,副varca... 有什么想法吗? 最佳答案 为两个开关添加
是否可以将图像添加到 UISwitch 背景,例如当状态为 ON 时(作为一个背景)和当状态为 OFF 时(另一个背景图像)? 最佳答案 要更改背景颜色(不是图像),您只需执行以下操作即可。这会更改领
我需要实现一个 View ,我需要用户使用"is"或“否”回答几个问题。我想过使用 UISwitch,但据我所知,它不允许用 YES/NO 替换它显示的 ON/OFF 消息。我错了吗? 我想过实现一个
我可以使用下面的代码更改 UISwitch 的颜色,但颜色始终为黄色,如何将颜色更改为另一种颜色? UISwitch *switch1=[[UISwitch alloc]initWithFrame:C
我有一个 UISwitch我把它放在我的 Storyboard 中并将它连接到我的实现文件中的 socket ,并连接了valueChanged:控制事件“值已更改”的方法。但是,仅当我将其从关闭切换
我想让 UISwitch 周围的触摸区域每边大 10 个点。查看相关帖子 (UIButton: Making the hit area larger than the default hit area
我正在开发一个具有 UISwitch 的应用程序。我想以编程方式将开关设置为开/关。我是这样试的,但是当setting时开关已经打开了是 false ... 有任何想法吗? @IBOutlet var
当用户打开开关时,我希望在 UILabel 上显示一个随机值,然后采用相同的随机值,并用它相乘并找到另一个值。我认为我的问题是我尝试使用 let 语句来保存该值,然后尝试从另一个函数回调该 let 值
我的 View Controller 上有一个 UISwitch,所以当我切换它时,按钮的文本会发生变化。我第一次将其关闭和打开时不起作用,但是如果您第二次尝试它,它就会起作用...我的代码中是否缺少
这可能看起来很傻,也许我理解不正确。 我的场景中有一个 UISwitch。 when a login button is clicked if the switch is on - do
我在我的应用程序中使用了 UISwitch 和 valueChanged 目标,如下代码所示。这个开关在我的 UITableView 中 settingsTableCell.androidSwitch
首先是我的 .h 文件: @interface SettingsViewController : UIViewController { IBOutlet UISwitch *gravaSwi
我是一名优秀的程序员,十分优秀!