我有一组图片,并希望具有“拖动重新排序”功能,我正在使用UICollectionView。
如果视图继承自UICollectionViewController
,那么我可以直接执行此操作
即,
public class SimpleCollectionViewController : UICollectionViewController
{}
覆盖CanMove
和CanMoveItem
代表。
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架构有关。
谢谢。
答案 0 :(得分:1)
您需要将一个继承自UICollectionViewSource
[1]的对象(或实现IUICollectionViewSource
interface [2]的对象)分配给UICollectionView.Source
属性,例如:
collectionView.Source = new MyUICollectionViewSource();
UICollectionViewSource
/ IUICollectionViewSource
基本上将UICollectionViewDelegate
/ IUICollectionViewDelegate
和UICollectionViewDataSource
/ IUICollectionViewDataSource
组合到一个类/接口中。您将注意到UICollectionView
[3]具有分配Delegate,DataSource和Source对象的属性。如果您只需要CanSoveItem和MoveItem都是DataSource方法的DataSource方法,那么只需使用从UICollectionViewDataSource
/ IUICollectionViewDataSource
继承的对象,并将该对象分配给集合视图的DataSource属性。
更新:有关UICollectionViewSource
和IUICollectionViewSource
(或代理或数据源)之间区别的一些说明。 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/