Xamarin iOS:编辑UICollectionView的单元格

时间:2016-12-13 20:00:45

标签: ios objective-c swift xamarin xamarin.ios

我有一组图片,并希望具有“拖动重新排序”功能,我正在使用UICollectionView。

如果视图继承自UICollectionViewController,那么我可以直接执行此操作 即,

 public class SimpleCollectionViewController : UICollectionViewController
    {}

覆盖CanMoveCanMoveItem代表。

   public override bool CanMoveItem(UICollectionView collectionView, NSIndexPath indexPath)
            {
                //System.Diagnostics.Debug.WriteLine("Checking if it can move the item");
                return true;
            }


public override void MoveItem(UICollectionView collectionView, NSIndexPath sourceIndexPath, NSIndexPath destinationIndexPath)
    {
        //base.MoveItem(collectionView, sourceIndexPath, destinationIndexPath);
        System.Diagnostics.Debug.WriteLine("Started moving item");
        var item = animals[(int)sourceIndexPath.Item];
        animals.RemoveAt((int)sourceIndexPath.Item);
        animals.Insert((int)destinationIndexPath.Item, item);
    }

但是我当前的视图不是从UICollectionViewController继承的,所以如何使用'UICollectionViewController'委托来重新排序UICollectionView中的项目

我添加了Objective-c和swift标签,因为这个问题与Xamarin无关,而是与iOS架构有关。

谢谢。

1 个答案:

答案 0 :(得分:1)

您需要将一个继承自UICollectionViewSource [1]的对象(或实现IUICollectionViewSource interface [2]的对象)分配给UICollectionView.Source属性,例如:

collectionView.Source = new MyUICollectionViewSource(); 

UICollectionViewSource / IUICollectionViewSource基本上将UICollectionViewDelegate / IUICollectionViewDelegateUICollectionViewDataSource / IUICollectionViewDataSource组合到一个类/接口中。您将注意到UICollectionView [3]具有分配Delegate,DataSource和Source对象的属性。如果您只需要CanSoveItem和MoveItem都是DataSource方法的DataSource方法,那么只需使用从UICollectionViewDataSource / IUICollectionViewDataSource继承的对象,并将该对象分配给集合视图的DataSource属性。

更新:有关UICollectionViewSourceIUICollectionViewSource(或代理或数据源)之间区别的一些说明。 iOS中的代理和DataSource是Obj-C协议(不确定它们在swift中的名称)。 Obj-C协议有点像C#接口,但是Obj-C协议可以有必需和可选的方法,而接口中的所有方法都必须由继承类实现。因此,当Xamarin绑定协议时,它们会从包含所有必需和可选方法的协议中创建一个类,因此您可以覆盖所需的那些,但我们还创建一个只具有协议所需方法的接口,因为我们不想强迫您实现协议的可选方法。但是,当一个类继承自接口版本IUICollectionViewSource时,您将只能覆盖所需的方法,但您仍然可以将可选方法添加到实现该接口的同一个类中。例如,您可以检查协议的类版本UICollectionViewSource,以查看可选方法的签名,然后在实现协议的Interface版本的类中实现它们。有关详细信息,请参阅[4]。

要在实现相关C#接口时实现协议的可选方法,您必须使用[Export()]属性向iOS运行时注册该方法。 E.G.,实现DataSource的CanMoveItem和MoveItem可选方法:

[Export ("collectionView:canMoveItemAtIndexPath:")]
public bool CanMoveItem (UICollectionView collectionView, NSIndexPath indexPath)
{
    // Do stuff
}

[Export ("collectionView:moveItemAtIndexPath:toIndexPath:")]
public void MoveItem (UICollectionView collectionView, NSIndexPath sourceIndexPath, NSIndexPath destinationIndexPath)
{
    // Do stuff
}

找到与[Export()]属性一起使用的Obj-C选择器的最简单方法,右键单击源代码中的IUICollectionViewDataSource并选择“转到声明(XS)/定义(VS) )“和程序集浏览器将打开。查找具有与您要实现的方法匹配的Name的Protocol Member。 Selector属性是您要在[Export()]属性中使用的Obj-C选择器。

[1] https://developer.xamarin.com/api/type/MonoTouch.UIKit.UICollectionViewSource/

[2] https://developer.xamarin.com/api/type/MonoTouch.UIKit.IUICollectionViewSource/

[3] https://developer.xamarin.com/api/type/MonoTouch.UIKit.UICollectionView/

[4] https://developer.xamarin.com/guides/ios/application_fundamentals/delegates,_protocols,_and_events/#Protocols