Swift 4使用Cells在collectionView中实现拖放

时间:2018-09-25 16:17:21

标签: ios swift uicollectionview drag-and-drop

我有一些自定义类,这些类创建了一个对象数组,然后将这些对象动态地转换为UICollectionView的单元格,并且这些类基本上都像这样:

<tr ng-repeat="s in rollCallList">
    <td align="left">{{s.Last_Name}}, {{s.First_Name}}</td>
    <td>
         <input name="{{s.dc_number}}" id="id1{{s.dc_number}}" type="radio" value="P" ng-checked="radiocheck" />P
                <input name="{{s.dc_number}}" id="id2{{s.dc_number}}" type="radio" value="A" />A
                <input name="{{s.dc_number}}" id="id3{{s.dc_number}}" type="radio" value="X" />X
    </td>
</tr>
<tr>
    <td colspan="2">
           <button class="btn" ng-show="SaveAttBtn" ng-click="SaveAtt(RollCallDate)">Save Attendance</button>
           <button class="btn" ng-show="DeleteAttBtn" ng-click="DeleteAtt(RollCallDate)">Delete Attendance</button>
    </td>
</tr>

$scope.SaveAtt = function (dt) {
        $scope.rollCallList.forEach(function (obj) {

            var dc = obj.dc_number;
            var attVal = $('input[name=' + dc + ']:checked').val();

            obj.status = attVal;
            obj.classDate = dt;

            console.log(obj);
        });
    }

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

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 = ""
 }

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

我看到我可能还需要将此做为NSItemProviderWriting类的扩展,但是我不确定如何做。

这是我的DragDelegate扩展的开头,其中错误发生在第4行,这是线程1:信号SIGABRT:

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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) 中询问问题,但问题是开发人员未提供该方法一个类实例,但是类名