2012-12-12 97 views
0

我可能會在這裏丟失一些東西,但是,當我手動取消選擇一行時,我無法讓Deselect事件在我的自定義Element類上觸發。我重寫了單元格以進行一些自定義繪圖,並且當單元格被選中/取消選擇時,我想更改字體的顏色。TableView.DeselectRow不觸發自定義元素的取消選擇事件

實際問題的一個工作示例詳述如下。

public class TestViewController : DialogViewController 
{ 
    public TestViewController() : base(UITableViewStyle.Plain, null, true) 
    { 
     Root = new RootElement(null); 
     var section = new Section(); 
     for (int i = 0; i <= 10; i++) 
     { 
      var element = new MyCustomElement(); 
      element.Tapped += (dvc, tableView, indexPath) => { 
       var sheet = new UIActionSheet("", null, "Cancel", null, null); 
       sheet.Dismissed += delegate(object sender, UIButtonEventArgs e) {     
        tableView.DeselectRow(indexPath, false); 
       }; 
       sheet.ShowInView(View); 
      }; 
      section.Add (element); 
     } 
     Root.Add (section); 
    } 
} 

public class MyCustomElement : Element, IElementSizing { 
    static NSString mKey = new NSString ("MyCustomElement"); 

    public MyCustomElement() : base ("") 
    { 
    } 

    public MyCustomElement (Action<DialogViewController,UITableView,NSIndexPath> tapped) : base ("") 
    { 
     Tapped += tapped; 
    } 

    public override UITableViewCell GetCell (UITableView tv) 
    { 
     var cell = tv.DequeueReusableCell (mKey); 
     if (cell == null) 
      cell = new UITableViewCell (UITableViewCellStyle.Default, mKey); 
     return cell; 
    } 

    public float GetHeight (UITableView tableView, NSIndexPath indexPath) 
    { 
     return 65; 
    } 

    public event Action<DialogViewController, UITableView, NSIndexPath> Tapped; 

    public override void Selected (DialogViewController dvc, UITableView tableView, NSIndexPath path) 
    { 
     Console.WriteLine("Selected!"); 
     if (Tapped != null) 
      Tapped (dvc, tableView, path); 
    } 

    public override void Deselected (DialogViewController dvc, UITableView tableView, NSIndexPath path) 
    { 
     // does not trigger when deselect manually invoked 
     Console.WriteLine("Deselected!"); 
     base.Deselected (dvc, tableView, path); 
    } 
} 

我也曾嘗試在DialogViewController重寫Deselected事件本身,甚至創建自定義Source,並在那裏重寫RowDeselected事件,但它仍然不會被觸發。我得到它觸發的唯一方法是如果我刪除Tapped處理程序並選擇一個不同的單元格。

要解決的問題是什麼,我此刻做的是手動迫使我打電話DeselectRow後更新自己的元素,但是,我想知道爲什麼不是觸發。

回答

0

您沒有收到取消選中事件,因爲deselectRowAtIndexPath:動畫:方法不會導致委託接收的tableView:didDeselectRowAtIndexPath:消息,也不會發送UITableViewSelectionDidChangeNotification通知觀察員和調用此方法不會造成任何滾動到取消行。

+0

出現一些限制,那麼你不覺得嗎?正如你從所示的例子中可以看到的,有一些明顯的例子,你想在列表視圖中手動取消選擇一個項目。是否有另一種方法可以取消選擇列表中將*發送通知的項目? – James

+0

其ios限制,而不是monotouchdialog。當出現tableView:didDeselectRowAtIndexPath:monotouch對話框調用了對目標元素的取消選擇的事件,但是當你調用tableView.DeselectRow(indexPath,false)時,tablesource不會接收tableView:didDeselectRowAtIndexPath:並且取消選中的事件不會被調用。您可以創建刪除選擇並調用元素的取消選擇事件的函數。 –

+0

我不知道我明白你的意思是「*當出現tableView:didDeselectRowAtIndexPath:monotouch對話框被稱爲取消選定的事件爲目標元素*」? 'DeselectRow'在幕後調用本地'didDeselectRowAtIndexPath'。 – James

相關問題