- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 uicollectionview 显示一些照片,我有一个按钮允许用户删除所选照片。
除非我尝试删除用于填充 uicollectionview 的照片数组中的最后一张照片,否则它会完美运行。也就是说,如果有 5 张照片,那么如果用户删除了第 5 张照片而不是第 1、2、3 或 4 张照片,就会出现问题。当我尝试删除第 5 张照片时,它在 reloadData() 上崩溃并出现以下错误
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试从更新前仅包含 4 项的第 0 节中删除第 4 项”
我不明白为什么会发生这种情况...该错误甚至提到“尝试删除”,但我从未真正告诉过它我正在删除任何内容。我只是更改了源,然后要求它更新。同样在错误消息中,它说该部分在更新前仅包含 4 个项目,而实际上它们是 5 张照片。为什么?
关于我在做什么以及如何(使用 Swift)的更多信息......
我有一个 ProgressPhotoSheetClass,我从中实例化了对象 progressPhotoSheet
这个 progressPhotoSheet 对象有一个照片数组,照片可以有优先级,例如照片 ID、标题等
在我使用的部分中的项目数量
var numPics: Int = progressPhotoSheet.progressPhotos.count
return numPics
在我使用的 cellForItemAtIndexPath 中
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! PhotoHolder
cell.photoTitle.text = progressPhotoSheet.progressPhotos[indexPath.row].photoName
...等..
删除我使用的项目时
progressPhotoSheet.deletePhoto(progressPhotoSheet.progressPhotos[indexPath.row].photoId)
它从设备和我的核心数据中删除了照片,然后使用修改后的核心数据重新加载 progressPhotoSheet.progressPhotos,因此它现在完全是以前的样子,但没有删除的照片。
然后我打电话
self.collectionView.reloadData()
应该为新数据更新 UICollectionView
如果我在使用时感觉 Collection View 中的内容与数据源中的内容不匹配,我可以理解 self.collectionView.deleteItemsAtIndexPaths(indexPaths)因为那会说被忽略以使它们匹配我们需要删除一个项目 - 这里有可能某些东西可能不匹配..但是肯定使用 self.collectionView.reloadData() 进行什么更改并不重要它应该只是查看现在有什么数据并相应地更新 UICollectionView....
所以我的问题是......为什么我会收到此错误以及我应该如何解决问题以免我不明白?
编辑以包含更多信息
这是我的长焦代码
func deletePhoto(photoId: Int) {
// Set up Core Data Managed Object Context
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
// Fetch correct photo
let fetchRequest = NSFetchRequest(entityName: "CDProgressPhoto")
fetchRequest.predicate = NSPredicate(format: "photoId = %@", String(photoId))
// Save
if let fetchResults = managedContext.executeFetchRequest(fetchRequest, error: nil) as? [NSManagedObject] {
if fetchResults.count != 0{
// Will only be one photo with this photo id
var photo = fetchResults[0]
photo.setValue(true, forKey: "toDelete")
// Save the object
var error: NSError?
if !managedContext.save(&error) {
println("Could not save \(error), \(error?.userInfo)")
}
}
}
// Reload from core data
self.loadPhotoSheetFromCoreData()
}
self.loadPhotoSheetFromCoreData() 然后在从核心数据获取新数据之前清空 progressPhotoSheet.progressPhotos...代码如下...
private func loadPhotoSheetFromCoreData() {
if(self.hasPhotoSheet()) {
// Clear existing photos
self.progressPhotos = []
// Set up Core Data Managed Object Context
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
let request = NSFetchRequest(entityName: "CDProgressPhoto")
let predicate1 = NSPredicate(format: "photoSheetId == %@", String(self.sheetId))
let predicate2 = NSPredicate(format: "toDelete == %@", false)
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false) as NSSortDescriptor]
var predicatesArray: [NSPredicate] = [predicate1, predicate2]
//predicatesArray.append(predicate1)
request.predicate = NSCompoundPredicate.andPredicateWithSubpredicates(predicatesArray)
let existings = managedContext.executeFetchRequest(request, error: nil)
let existingPhotos: [CDProgressPhoto] = existings as! [CDProgressPhoto]
// for each photo make a ProgressPhoto object and add to progress photos array
for photo in existingPhotos {
var newPhoto: ProgressPhoto = ProgressPhoto()
newPhoto.photoSheetId = Int(photo.photoSheetId)
newPhoto.photoId = Int(photo.photoId)
newPhoto.photoName = photo.photoName
newPhoto.date = Int(photo.date)
newPhoto.url = photo.url
newPhoto.filename = photo.filename
newPhoto.height = Float(photo.height)
newPhoto.width = Float(photo.width)
newPhoto.selected = false
self.progressPhotos.append(newPhoto)
}
}
}
如您所见,此时照片实际上并未删除,我只是将 toDelete 标志设置为 true,然后仅重新加载 toDelete 设置为 false 的项目。照片稍后会根据网络连接等情况异步删除,因为它们也存储在服务器上以供在主网站上使用。
最佳答案
您是否尝试过在 collectionView 上调用 invalidateLayout()?如果您的 View 为空,即存在 0 个元素,这可能会有所帮助。
关于ios - 为什么 UICollectionView reloadData 会导致我的应用崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30556893/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!