- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 UISwitch 作为附件 View 的 UITableView。我的问题是,如果我切换其中一个开关然后滚动,以便将其从 View 中移出,它会返回到以前的状态。
请看 video .
有谁知道这可能是为什么以及如何解决它?
这是添加切换 View 并处理其操作的代码。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"POICell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier ];
//set the cell text to the
cell.textLabel.text = [self.catNames objectAtIndex:[indexPath row]];
NSString *toggle = [self.toggleArray objectAtIndex:[indexPath row]];
//add switch
cell.selectionStyle = UITableViewCellSelectionStyleNone;
//create an instance of the database oject
DataBase * dataBase = [[DataBase alloc] init];
//open the database connection
[dataBase openDB];
NSString *imageName = [dataBase getPinImageNameFromCatID:[self.catIDs objectAtIndex:[indexPath row]]];
//get the root file path for the images
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/pinImages/%@",documentsDirectory, imageName];
//add image
NSURL *imageURL = [NSURL fileURLWithPath:filePath];
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage *image = [UIImage imageWithData:imageData];
cell.imageView.image = image;
NSLog(@"%@",[self.catIDs objectAtIndex:[indexPath row]]);
UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
cell.accessoryView = switchView;
[switchView addTarget:self action:@selector(switchChanged: ) forControlEvents:UIControlEventValueChanged];
if ([toggle isEqualToString: @"OFF"]) {
[switchView setOn:NO animated:NO];
}else{
[switchView setOn:YES animated:NO];
}
return cell;
}
- (void) switchChanged:(id)sender {
//get the switch that it was sent from
UISwitch *switchInCell = (UISwitch *)sender;
//get the cell it was sent from
UITableViewCell * cell = (UITableViewCell *) switchInCell.superview;
//get the row it was sent from
NSIndexPath * indexpath = [self.inputTableView indexPathForCell:cell];
//cast the indexpath to int
NSInteger variable = indexpath.row;
//set the filter as off in the user defualts.
[self.filterDic setValue:switchInCell.on ? @"ON" : @"OFF" forKey:[self.catIDs objectAtIndex:variable]];
//store the newdic in the user defualts
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
//save the dic to user defaults
[prefs setObject:self.filterDic forKey:@"pinFilters"];
}
最佳答案
您的代码有两个问题(至少:)
让我从让你困惑的一个开始。
您根据 toggle
设置每个女巫的状态.和 toggle
的值从数组 self.toggleArray
中提取.
到目前为止还好。
但是当一个值改变并且 Action switchChanged
被调用然后你更新self.filterDic
但你不更新self.toggleView
.
这导致了问题:
下次当单元格变得可见时cellForRowAtIndexPath
再次调用并将根据 toggle
设置值这是基于self.toggleArray
.而且它仍然具有旧的值(value)观……你看到了吗?
你犯这个错误可能是因为你还没有完全理解细胞循环机制。这可能是导致我发现的第二个问题的原因。让我试着解释一下。
iOS 或 cocoa 分别尝试将 View 单元对象分配为必要的。这意味着从屏幕上滚动的单元格被添加到池中,下次需要(类似)销售时,可以从该池中重新使用它。所以每次需要一个新的单元格(一个可见的)cellForRowAtIndexPath
叫做。在您使用 dequeueReusableCellWithIdentifier
获取单元格的过程中.如果该池中有一个单元格使用相同的重用标识符进行了初始化,那么那个(或其中之一)将返回给调用者。
在最近的 iOS(分别为 SDK 版本)版本中,如果这些单元都不存在,则将分配并返回一个新单元。 (这就是为什么 Murali 的建议也不能完美发挥作用的原因)
在旧版本中,您必须检查单元格是否为 nil,并在这些情况下重新分配/初始化。
之后,您可以自由分配新的 subview 对象,无论单元格是否被重新循环并且是否已经具有这些 subview 。然后,您一次又一次地添加并添加和添加相同的 subview 。
你怎么能解决这个问题?像往常一样,有几种处理方法:
首先 - 检查细胞是否被重复使用。只需检查 Switch 是否已经存在。为此,您可以使用一些不同于 0 的值对其进行标记,并使用此标记获取 subview 。如果你没有得到它,那么这个单元格是新的,你必须创建所有额外的 subvies。
第二 - 您总是可以在使用 dequeueReusableCellWithIdentifier
获取单元格后立即从单元格中删除所有 subview .这是最简单的解决方案,因为您不必将 mutch 更改为现有代码。虽然它不是最高效的解决方案。
第三 - 最优雅的解决方案可能是子类 UITableViewCell
每次您想将自定义元素添加到单元格时。在这种情况下,它的 init 方法只会在创建时调用一次(而不是在重用时),您可以在其中以编程方式添加所有自定义 subview 。当然,您可以像使用每个 UIView
一样设计单元格并在 IB 中添加所有 subview 。目的。威廷 cellForRowAtIndexPath
您只需要关心设置适当的值。
关于iphone - UISwitch 在 UITableView 的滚动上取消切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14521208/
是否可以使用标准输入/标准输出在 bash 中压缩/解压缩字符串? 我试过了,但显然不支持它? hey=$(echo "hello world" | gzip -cf) echo $hey # ret
我的任务是让一个企业网站适用于 IE7,它必须“足够好”,因此我禁用了任何导致问题的花哨/非必要功能。 其中之一是正在使用的搜索栏,需要进行哪些搜索,我猜测幕后某个地方有某种 JavaScript 用
我有一个执行大量处理的小程序。您可以通过按回车键打印进度。 我实现它的方法是在主线程中完成处理,同时我有一个 pthread 不断循环 getchar() 以等待输入键。 问题是当我完成处理时。发生这
我完全理解 suspendCoroutine 与 suspendCancellableCoroutine 在我的示例中的工作方式。但我想知道为什么 println("I finished") (第 1
我是 QT 的新手。目前在我的项目中我实现了 QFileDialog . 在我的用例中:每当用户选择一个文本文件时,它都会执行 functionA .但是,我发现如果在文件对话框中单击取消,funct
我有代码,仅在用户选择“另存为”时运行。为此并获取我正在使用的文件的新名称 Application.GetSaveAsFilename功能。 我遇到的问题是类型不匹配,同时检查用户是否在他没有这样做时
我的 UILocalNotification 有问题。 我正在用我的方法安排通知。 - (void) sendNewNoteLocalReminder:(NSDate *)date alrt:(NS
祝你有美好的一天 我有一个网站,其中有很多“工具提示”。这些工具提示是在将鼠标悬停在文本的特定部分上时创建的。工具提示是一个 div block ,它显示在网站上所有其他内容的顶部,并且当光标从文本移
我遇到以下问题。每隔 2 秒,程序就会进入 if 语句。在这个 if 语句中,我想要一个计时器,它会在 15 秒后给我一条消息。计时器应延迟 1 秒运行。但是当我用计时器“等待”时,if 语句将再执行
基本上我有以下代码片段, (let [task (FutureTask. fn) thr (Thread. task)] (.start thr) ;;wait for signa
取消正在进行的 ASIHttpRequest 请求的正确位置在哪里?这就是我取消的方式,但是当我 时它继续崩溃在不让请求完成的情况下从一个 View Controller 转移到另一个 View Co
我在我的 winforms 应用程序中使用 BackgroundWorker 来执行另一个类中发生的长时间运行的任务(执行数据库操作)。由于所有工作都是在另一个类中完成的,因此取消并不那么简单。我在另
我正在使用 OneSignal 向我的用户显示通知。通知工作正常,但我注意到,如果我在通知栏中“滑动”取消通知,则通知将永远保留,这是一张显示应用程序图标上的通知的图像,我想在应用程序已打开: 我看到
正在运行的 AsyncTask 的 .cancel(boolean) 方法如何工作?这是文档: Attempts to cancel execution of this task. This atte
我注意到,当我激活约束时,我会立即在该行代码处收到一条警告,指出不能同时满足约束。 我假设布局是在“UI 更新周期”之类的稍后时间点计算的,而不是每次约束都被(取消)激活。因此,在(取消)激活约束的代
这是我创建线程的方式: readFromWebThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadThread:
我目前正在尝试取消与我的数据模型中的对象关联的特定 UILocalNotifications。为此,每个数据对象都有一个唯一标识符,即 NSUUID。 创建 UILocalNotification:
当我提交并单击“确定”时,它会继续,但当我按“取消”时,它仍然会提交。我尝试使用此代码,但提交和取消按钮仍然执行相同的操作。 model.saveForm = function() { var
我有一个警报弹出窗口,当发生特定操作时会出现该弹出窗口。 5 秒后,使用 setTimeout() 隐藏警报弹出窗口。 我遇到的问题是,如果我多次触发弹出窗口,有时后续的弹出窗口会出现但立即消失。我相
我有一些 javascipt (jQuery),其中单击按钮时会淡入 #myDiv,然后使用超时函数在 5 秒后再次淡出。它工作正常,但如果用户在超时内的 fadeOut 函数运行之前再次单击该按钮,
我是一名优秀的程序员,十分优秀!