2016-09-08 42 views
0

有一個AccessoryButtonTapped方法覆蓋表視圖委託,但它不知道如何在ListViewRenderer子類中執行該方法?如何處理Xamarin.Forms中的iOS附件按鈕水龍頭?

所以我可以顯示泄露指標,但無法處理它。

public class ContactCellRenderer : ImageCellRenderer 
{ 
    public override UITableViewCell GetCell (
     Cell item, UITableViewCell reusableCell, UITableView tv) 
    { 
     var cell = base.GetCell (item, reusableCell, tv); 
     cell.Accessory = UITableViewCellAccessory.DetailDisclosureButton; 
     return cell; 
    } 
} 

回答

1

我認爲,您只需在您的渲染器中實現方法AccessoryButtonTapped

public class ContactListViewRenderer : ListViewRenderer, IUITableViewDelegate 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<ListView> e) 
    { 
     base.OnElementChanged(e); 
     if (Control != null) 
     { 
      Control.WeakDelegate = this; // or. Control.Delegate 
     } 
    } 

    public virtual void AccessoryButtonTapped(UITableView tableView, NSIndexPath indexPath) 
    { 
     // accessory tapped 
    } 
} 
+0

謝謝,史文邁克爾,我會嘗試。設置'WeakDelegate'安全嗎? :)我認爲它已經設置爲一些默認的實現。 – rudyryk

1

除了斯文 - 邁克爾,你可以通過創建一個繼承豐富他的代碼,你ListView(如果你不已經有一個),並添加一個Delegate它是這樣的:

public class AccessoryListView : ListView 
{ 
    public delegate void OnAccessoryTappedDelegate(); 

    public OnAccessoryTappedDelegate OnAccessoryTapped { get; set; } 
} 
從您的自定義呈現

現在 - 不要忘了將它設置爲你的新繼承ListView - 調用該委託

public class ContactListViewRenderer : ListViewRenderer, IUITableViewDelegate 
{ 
    private AccessoryListView _formsControl; 

    protected override void OnElementChanged(ElementChangedEventArgs<AccessoryListView> e) 
    { 
     base.OnElementChanged(e); 
     if (Control != null) 
     { 
      Control.WeakDelegate = this; // or. Control.Delegate 
     } 

     if (e.NewElement != null) 
      _formsControl = e.NewElement; 
    } 

    public virtual void AccessoryButtonTapped(UITableView tableView, NSIndexPath indexPath) 
    { 
     // accessory tapped 
     if (_formsControl.OnAccessoryTapped != null) 
      _formsControl.OnAccessoryTapped(); 
    } 
} 

當然,你可以添加這樣我的參數在那裏爲您的共享代碼提供更多的數據。有了這個,你確實有一些特定於平臺的代碼,但你會盡快回到你的共享代碼中,使你的代碼更加可重用。

另一個帶有Map控件的示例可以在here找到。

相關問題