我有一些自定义类,这些类创建一个对象数组,然后将其动态转换为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:信号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]
}
谢谢!
最佳答案
首先,您需要删除此行上的项目:
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)中问问题,但是问题是开发人员没有给该方法提供类实例,而是给了类名