【问题标题】:Swift 4 Implementing drag & drop in collectionView with CellsSwift 4 使用 Cells 在 collectionView 中实现拖放
【发布时间】:2018-09-25 16:17:20
【问题描述】:

我有自定义类,它们创建一个对象数组,然后为我的 UICollectionView 动态转换为单元格,这些类基本上都如下所示:

import Foundation

class BoardNote : NSObject {    
   var note_id : String = ""
   var itemType : String = ""
   var added_by : Any = ""
   var link : Any = ""
   var content : String = ""
   var board_id : Any = ""
   var date_added : Any = ""
 }

然后使用这个类的一个实例来创建一个像这样的单元格:

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: 
"noteViewCell", for: indexPath) as! NoteViewCell
        cell.content.text = (itemArray[indexPath.row] as! 
BoardNote).content
        cell.noteId = (itemArray[indexPath.row] as! BoardNote).note_id
        print("made note cell")
        return cell

当我尝试在我的集合视图中实现基本拖放时,我收到错误“无法将“BoardNote”类型的值转换为“NSObject”。

我发现我可能还需要将此作为类 NSItemProviderWriting 的扩展,但我不确定如何。

这是我的 DragDelegate 扩展的开始,错误发生在第 4 行,即线程 1:signal SIGABRT:

extension BoardViewController : UICollectionViewDragDelegate
{
func collectionView(_ collectionView: UICollectionView, 
itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> 
[UIDragItem]
{
    let item = self.itemArray[indexPath.row]
    let itemProvider = NSItemProvider(object: item as! NSObject as! 
NSItemProviderWriting)
    let dragItem = UIDragItem(itemProvider: itemProvider)
    dragItem.localObject = item
    return [dragItem]
}

谢谢!

【问题讨论】:

    标签: ios swift uicollectionview drag-and-drop


    【解决方案1】:

    首先,您需要删除该行上的项目:

    NSItemProvider(object: item as! NSObject as! NSItemProviderWriting)
    

    做到这一点:

     NSItemProvider(object: item)
    

    然后,错误是不言自明的:您需要使您的自定义类符合 NSItemProviderWriting 和 NSItemProviderReading 协议,然后添加协议所需的存根方法:

    class BoardNote : NSItemProviderWriting, NSItemProviderReading{    
       var note_id : String = ""
       var itemType : String = ""
       var added_by : Any = ""
       var link : Any = ""
       var content : String = ""
       var board_id : Any = ""
       var date_added : Any = ""
     }
    

    注意:你可以省略 NSObject 继承,here 就是原因

    您只需点击错误红色信号,然后点击“修复”即可添加协议存根。

    Here 一个关于如何进行拖放的教程,因此您可以检查如何填充 NSItemProviderWriting 和 NSItemProviderReading 协议存根。

    Here类似的问题可以查

    基本上,我链接的问题是在您的同一行 NSItemProvider(object: item) 中询问问题,但问题是开发人员没有提供方法一个类实例,但类名

    【讨论】:

    • 您好安德里亚,感谢您的帮助!我已经听取了您的建议并按照该教程实施了符合要求的事情,但我似乎无法克服我的课程不符合可解码和可编码协议的错误。有什么想法吗?
    • ^^ 我想通了,所有类型都需要符合原始类型。仍在努力实现拖放,将很快更新!
    • 嗨!所以我已经实现了那篇文章中建议的所有内容,除了当我按住一个项目并尝试拖动它时会弹出一个放大镜之外,什么都没有发生。我在拖放功能中有打印日志,但没有出现。我应该把我的代码放在我的 OG 问题中吗?
    • 您分配了代表吗?我忘了告诉你你也必须遵守 Codable/Decodable 协议。 -> collectionView.dragDelegate = self ; collectionView.dropDelegate = self
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多