【问题标题】:Reorder UicollectioView items using RealmSwift on drag and drop在拖放时使用 RealmSwift 重新排序 UicollectioView 项目
【发布时间】:2016-11-13 10:20:13
【问题描述】:

我正在尝试使用 RealmSwift 作为数据库在拖放时重新排序 UICollectionViewcell 图像,我的 UI 没有在拖放和奇怪的行为中更新,一些图像重复,我的代码是这样的

RealmModel 作为

class StoryAlbumDM: Object {

    dynamic var id = 0
    dynamic var type = ""
    dynamic var isImage: Int = 0
    dynamic var textData = ""
    dynamic var imageData: NSData? = nil
    dynamic var rowId: Int = 0
    dynamic var position: Int = 0
    dynamic var storyId: Int = 0
    dynamic var isCoverImage: Int = 0
    dynamic var imagePath = ""

    let allStories = List<StoryAlbumDM>()
}

在拖放时我正在这样做

func collectionView(collectionView: UICollectionView, atIndexPath: NSIndexPath, didMoveToIndexPath toIndexPath: NSIndexPath) {

        print("moveItemAtIndexPath")
        let fromIndexPath: Int = atIndexPath.row
        print("from", fromIndexPath)

        let toIndexPathInt: Int = toIndexPath.row
        print("To", toIndexPath)
        let fromData: StoryAlbumDM!
        fromData = realm.objects(StoryAlbumDM.self).filter("position = %d AND storyId = %d", fromIndexPath, self.storyID).first!
        let toData: StoryAlbumDM!
        toData = realm.objects(StoryAlbumDM.self).filter("position = %d AND storyId = %d", toIndexPath, self.storyID).first!
        var tempData = StoryAlbumDM()

        self.performSelectorOnMainThread(#selector(StoryViewController.updateSrtoryInRealm), withObject: self.collectionView, waitUntilDone: true)

        dispatch_async(dispatch_get_main_queue(), {
            self.collectionView.performBatchUpdates({
                self.collectionView.reloadData()
                }, completion: nil)
        })
  }

func updateSrtoryInRealm() {

        self.tempData.type = self.toData.type
        self.tempData.isImage = self.toData.isImage
        self.tempData.textData = self.toData.textData
        self.tempData.rowId = self.toData.rowId
        self.tempData.imageData = self.toData.imageData
        self.tempData.position = self.toData.position
        self.tempData.storyId = self.toData.storyId
        self.tempData.isCoverImage = self.toData.isCoverImage
        self.tempData.imagePath = self.toData.imagePath

        do {
            try! realm.write {

                self.toData.type = self.fromData.type
                self.toData.isImage = self.fromData.isImage
                self.toData.textData = self.fromData.textData
                self.toData.rowId = self.fromData.rowId
                self.toData.imageData = self.fromData.imageData
                self.toData.position = self.fromData.position
                self.toData.storyId = self.fromData.storyId
                self.toData.isCoverImage = self.fromData.isCoverImage
                self.toData.imagePath = self.fromData.imagePath

                // title.id = temp.id
                self.fromData.type = self.tempData.type
                self.fromData.isImage = self.tempData.isImage
                self.fromData.textData = self.tempData.textData
                self.fromData.rowId = self.tempData.rowId
                self.fromData.imageData = self.tempData.imageData
                self.fromData.position = self.tempData.position
                self.fromData.storyId = self.tempData.storyId
                self.fromData.isCoverImage = self.tempData.isCoverImage
                self.fromData.imagePath = self.tempData.imagePath
            }
            //}
        }
        catch {
            print("Printed error : ")
        }

问题:图像重复,用户界面未更新,重新排序奇怪的行为,请帮助我

【问题讨论】:

  • 你好@TiM 你有问题吗

标签: swift2 uicollectionview ios9 realm


【解决方案1】:

我最近回答了a similar question,但我会在这里重新解释一下。 :)

在 Realm 文件中重新排序 Realm 对象的最好和最快的方法是创建一个包含给定类型的所有 Realm 对象的总体 List 对象。

例如,在这种情况下,您创建另一个对象来保存您已经创建的 allStories 值:

// Model class that manages the ordering of story album objects
class StoryAlbumDMList: Object {
   let allStories = List<StoryAlbumDM>()
}

// Model class for the actual story album objects
class StoryAlbumDM: Object {
   dynamic var id = 0
   dynamic var type = ""
   dynamic var isImage: Int = 0
   dynamic var textData = ""
   dynamic var imageData: NSData? = nil
   dynamic var rowId: Int = 0
   dynamic var position: Int = 0
   dynamic var storyId: Int = 0
   dynamic var isCoverImage: Int = 0
   dynamic var imagePath = ""
}

这样,当你想重新排序列表时,你需要做的就是在这个数组中重新排序。

就像我在另一个问题中所说的那样,另一种方法是添加另一个名为 orderedIndex 的属性(虽然效果不太好,但也不需要额外的 Realm 对象),它只包含一个数字表示这些对象的数字顺序。当您想重新订购它们时,只需重新设置这些数字即可。

如果您需要更多说明,请告诉我!

【讨论】:

  • 嗨,你的意思是我们通过新的orderedIndex而不是通过primarykey来获取项目?如果可能的话,希望对此进行更多澄清;)
  • 嗨!所以我的意思是你会像let sortedObjects = try! Realm().objects(Object.self).sorted("orderedIndex") 这样查询它,而不是通过它的主键手动获取一个对象。当您想要重新排序列表时,您只需遍历每个对象并更新其orderedIndex 属性。当然,像我上面所说的那样使用List 对 Realm 来说效率更高,所以更推荐使用它。 :)
  • Hey TiM 将请详细解释我,我如何获取 let allStories = List() 以及如何在我的 cellForRowindexPath 中设置,我没有得到确切的信息,感谢您的帮助跨度>
  • 嗨,安静!我更新了我的答案,使其更加明显。这个想法是您有一个单独的 Realm 对象,其中包含一个 List,您可以将所有 StoryAlbumDM 对象添加到该对象。然后,您只需获取此对象,例如 let allStories = try! Realm().objects(StoryAlbumDMList.self).first?.allStories,然后将其直接附加到您的表格视图。
猜你喜欢
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多