Swift 4 Реализация перетаскивания в collectionView с ячейками - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть пользовательские классы, которые создают массив объектов, которые затем динамически превращаются в ячейки для моего 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 ». *»1007 *

Я вижу, что мне может потребоваться также сделать это расширением класса 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]
}

Спасибо!

1 Ответ

0 голосов
/ 25 сентября 2018

Во-первых, вам нужно удалить предмет, наложенный на эту строку:

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 Наследование, здесь , поэтому

Вы можете добавить заглушки протокола, просто нажав на красный сигнал об ошибке, затем нажав «Исправить».

Здесь учебник о том, как выполнять перетаскивание, чтобы вы могли проверить, как заполнять заглушки протоколов NSItemProviderWriting и NSItemProviderReading.

Здесь аналогичный вопрос вы можете проверить

По сути, вопрос, который я связал, касался проблемы в той же строке NSItemProvider (object: item) , но проблема заключалась в том, что разработчик не давал методу методэкземпляр, но имя класса

...