- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在使用照片框架编写一个 iOS8 应用程序。我真的很喜欢 PHFetchResultChangeDetails。但是有些事情我不明白:当我使用以下代码将新照片保存到相机胶卷时,我会取回插入和更改。我只希望插入。
具体来说:
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest* newPhotoChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
PHAssetCollectionChangeRequest* albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:_album];
[albumChangeRequest addAssets:[NSArray arrayWithObject:newPhotoChangeRequest.placeholderForCreatedAsset]];
...
操作是使用上面的代码插入3张照片。之前:ipad 上的 5 张照片。之后:ipad 中的 8 张照片。PHFetResultChangeDetails 处理程序上的断点显示:
(lldb) po insertionIndexPaths
<__NSArrayM 0x7913be10>(
<NSIndexPath: 0x78e39020> {length = 2, path = 0 - 5},
<NSIndexPath: 0x78e3c910> {length = 2, path = 0 - 6},
<NSIndexPath: 0x78e39480> {length = 2, path = 0 - 7}
)
--> 好:有道理!这些是我刚刚插入的照片(最后 3 个索引路径)。
(lldb) po changeIndexPaths
<__NSArrayM 0x78e3c420>(
<NSIndexPath: 0x78e3c7e0> {length = 2, path = 0 - 2},
<NSIndexPath: 0x78e3c7a0> {length = 2, path = 0 - 3},
<NSIndexPath: 0x78e3c7b0> {length = 2, path = 0 - 4}
)
--> 不明白:为什么这些被认为是“改变的”?这些是相机胶卷中现有的照片……我没有对它们做任何事情。
感谢您的帮助。
更新:看起来它可能与选择有关。我没有提到,当已经选择了一些单元格时会发生这种情况。我看到的是,当在 collectionView 的末尾插入新项目时,一些选定的单元格会随机取消选择——我认为是那些具有 changeIndexPaths 的单元格。哇,太糟糕了——我看不出我的代码怎么能做到这一点!有什么提示吗?
UPDATE2: 因此,伪造的 changeIndexPaths 似乎始终是插入路径(始终位于末尾)之前的 3 个 indexPaths。为什么?!
UPDATE3:我还看到 UICollectionView 的 performBatchUpdates 崩溃,当数据源事先正确更新时,如果有插入和重新加载。例如,当更改看起来像这样时:
<PHFetchResultChangeDetails: 0x1742b91a0>
before=<PHFetchResult: 0x1702b5d20> count=31,
after=<PHFetchResult: 0x1702b5ea0> count=33,
hasIncremental=1 deleted=(null),
inserted=<NSMutableIndexSet: 0x17444aef0>[number of indexes: 2 (in 2 ranges), indexes: (30 32)],
changed=<NSMutableIndexSet: 0x17444a9b0>[number of indexes: 4 (in 2 ranges), indexes: (27-29 31)],
hasMoves=0
...然后我的应用程序在 performBatchUpdates 中崩溃并出现异常:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete item 31 from section 0 which only contains 31 items before the update'
这是我直接从 Apple 文档 (!) 复制的 performBatchUpdates 代码,所以我看不出为什么 changeIndexPaths 包含索引 31,因为在插入之前,count=31:
[self.collectionView performBatchUpdates:^{
if( deletionIndexPaths.count )
[self.collectionView deleteItemsAtIndexPaths:deletionIndexPaths];
if( insertionIndexPaths.count )
[self.collectionView insertItemsAtIndexPaths:insertionIndexPaths];
if( changeIndexPaths.count )
[self.collectionView reloadItemsAtIndexPaths:changeIndexPaths];
if( moveBlock )
moveBlock(self.collectionView);
} ...
最佳答案
回复:更新 3
尽管示例代码怎么说,changedIndexes 不能像这样在 performBatchUpdates 中使用。
索引 PHFetchResultChangeDetails.changedIndexes 是相对于原始提取结果之后删除了 removedIndexes 中的索引,之后添加了 insertedIndexes 中的新索引。
但是,UITableView 和 UICollectionView API 要求在批量更新中调用 reloadItems* 方法时,具有来自任何其他更改的索引。
要解决此问题,请在批量更新之外调用重新加载和移动条目,例如:
[self.collectionView performBatchUpdates:^{
if( deletionIndexPaths.count )
[self.collectionView deleteItemsAtIndexPaths:deletionIndexPaths];
if( insertionIndexPaths.count )
[self.collectionView insertItemsAtIndexPaths:insertionIndexPaths];
} ... ]
if( changeIndexPaths.count )
[self.collectionView reloadItemsAtIndexPaths:changeIndexPaths];
if( moveBlock )
moveBlock(self.collectionView);
关于ios - 为什么我的 PHFetchResultChangeDetails 已更改索引,而我所做的只是在最后插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290061/
这个问题在这里已经有了答案: “return” and “try-catch-finally” block evaluation in scala (2 个回答) 7年前关闭。 为什么method1返
我有一个动态列表,需要选择最后一项之前的项目。 drag your favorites here var lastLiId = $(".album
我想为每个线程执行特定操作,因此,我认为tearDown Thread Group 不起作用。 是否有任何替代方法可以仅在线程的最后一次迭代时运行“仅一次 Controller ”? 谢谢。 最佳答案
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我想为每个线程执行特定操作,因此,我认为tearDown Thread Group 不起作用。 是否有任何替代方法可以仅在线程的最后一次迭代时运行“仅一次 Controller ”? 谢谢。 最佳答案
有没有可能 finally 不会被调用但应用程序仍在运行? 我在那里释放信号量 finally { _semParallelUpdates.Re
我收藏了 对齐的元素,以便它们形成两列。使用 nth-last-child 的组合和 nth-child(even) - 或任何其他选择器 - 是否可以将样式应用于以下两者之一:a)最后两个(假设
我正在阅读 Jon Skeet 的 C# in Depth . 在第 156 页,他有一个示例, list 5.13“使用多个委托(delegate)捕获多个变量实例化”。 List list = n
我在 AM4:AM1000 范围内有一个数据列表(从上到下有间隙),它总是被添加到其中,我想在其中查找和总结最后 4 个结果。但我只想找到与单独列相对应的结果,范围 AL4:AL1000 等于单元格
我最近编写了一个运行良好的 PowerShell 脚本 - 然而,我现在想升级该脚本并添加一些错误检查/处理 - 但我似乎被第一个障碍难住了。为什么下面的代码不起作用? try { Remove-
这个问题在这里已经有了答案: Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of
使用 Django 中这样的模型,如何检索 30 天的条目并计算当天添加的条目数。 class Entry(models.Model): ... entered = models.Da
我有以下代码。 public static void main(String[] args) { // TODO Auto-generated method stub
这个问题在这里已经有了答案: Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of
这个问题已经有答案了: Multiple returns: Which one sets the final return value? (7 个回答) 已关闭 8 年前。 我正在经历几个在工作面试中
$ cat n2.txt apn,date 3704-156,11/04/2019 3704-156,11/22/2019 5515-004,10/23/2019 3732-231,10/07/201
我可以在 C/C++ 中设置/禁用普通数组最后几个元素的读(或写)访问权限吗?由于我无法使用其他进程的内存,我怀疑这是可能的,但如何实现呢?我用谷歌搜索但找不到。 如果可以,怎样做? 因为我想尝试这样
我想使用在这里找到的虚拟键盘组件 http://www.codeproject.com/KB/miscctrl/touchscreenkeyboard.aspx就像 Windows 中的屏幕键盘 (O
我正在运行一个 while 循环来获取每个对话的最新消息,但是我收到了错误 [18-Feb-2012 21:14:59] PHP Warning: mysql_fetch_array(): supp
这个问题在这里已经有了答案: How to get the last day of the month? (44 个答案) 关闭 8 年前。 这是我在这里的第一篇文章,所以如果我做错了请告诉我...
我是一名优秀的程序员,十分优秀!