2016-12-13 44 views
0

我有一組圖像,並希望具有'拖動重新排序'的功能我正在使用UICollectionView。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和快捷的標籤,因爲這問題是與Xamarin無關,但與iOS架構相關。

謝謝。

回答

1

你將需要分配一個對象,從UICollectionViewSource [1](或對象實現IUICollectionViewSource接口[2])到UICollectionView.Source屬性繼承,例如:

collectionView.Source = new MyUICollectionViewSource(); 

UICollectionViewSource/IUICollectionViewSource基本上結合了UICollectionViewDelegate/IUICollectionViewDelegateUICollectionViewDataSource/IUICollectionViewDataSource合併成一個類/接口。您會注意到UICollectionView [3]具有分配Delegate,DataSource和Source對象的屬性。如果您只需要DataSource方法(CanMoveItem和MoveItem都是DataSource方法),那麼只需使用繼承自UICollectionViewDataSource/IUICollectionViewDataSource的對象並將該對象分配給集合視圖的DataSource屬性。

UPDATE:一些澄清UICollectionViewSourceIUICollectionViewSource(或代表或數據源)之間的差。 iOS中的委託和數據源是Obj-C協議(不確定它們在swift中調用的是什麼)。 Obj-C協議有點像C#接口,但Obj-C協議可以具有必需的和可選的方法,而接口中的所有方法都必須由繼承類實現。因此,當Xamarin綁定協議時,他們從協議中創建一個類,該協議中包含所有必需的和可選的方法,因此您可以覆蓋所需的方法,但是我們也創建一個只有協議所需方法的接口,因爲我們不想強迫你實現協議的可選方法。但是,當一個類繼承自接口版本IUICollectionViewSource時,您將只能覆蓋所需的方法,但仍然可以將可選方法添加到實現接口的相同類中。例如,您可以檢查協議的類版本UICollectionViewSource,以查看可選方法的簽名,然後僅在實現協議的接口版本的類中實現它們。欲瞭解更多信息,請參閱[4]。

要在實現相關C#接口時實現協議的可選方法,必須使用[Export()]屬性將方法註冊到iOS運行時。例如。,實現數據源的CanMoveItem和移動選項可選方法:

[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()]屬性使用,右鍵點擊你的源代碼的IUICollectionViewDataSource並選擇最簡單的方式「去到宣言(XS)/定義(VS)「並且大會瀏覽器將打開。查找名稱與您要實施的方法相匹配的協議成員。 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

+0

您好@jgoldberger 的IUICollectionViewDataSource只有'GetItemCount'和'GetCell'功能。它沒有'CanMoveItem'和'MoveItem'。 – TheDeveloper

+0

我會更新我的答案。 – jgoldberger

+0

〜jgoldBerger,謝謝你的回答。它的工作現在。但我陷入另一個問題。當cellzise很小時,MoveItem和canMove不會被調用。只有在單元大小較大時,纔會調用MoveItem和CanMove。我在[這裏]發佈了新的問題(http://stackoverflow.com/questions/41248063/xamarin-uicollection-image-reorder-issue)你能幫我解決嗎? 謝謝。 – TheDeveloper