1

我可能在这里遗漏了一些东西,但是,当我手动取消选择一行时,我无法Deselect在我的自定义类上触发事件。Element我正在覆盖单元格以进行一些自定义绘图,并且我想在选择/取消选择单元格时更改字体的颜色。

下面详细介绍了实际问题的工作示例。

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);
    }
}

我也尝试过覆盖Deselected事件DialogViewController本身,甚至创建一个自定义Source并覆盖其中的RowDeselected事件,但它仍然没有被触发。触发它的唯一方法是删除Tapped处理程序并选择不同的单元格。

为了解决这个问题,我目前正在做的是手动强制元素在我调用后自行更新DeselectRow,但是,我想知道为什么它没有触发。

4

1 回答 1

0

您不会收到 Deselected 事件,因为 deselectRowAtIndexPath:animated: 方法不会导致委托接收 tableView:didDeselectRowAtIndexPath: 消息,也不会向观察者发送 UITableViewSelectionDidChangeNotification 通知,并且调用此方法不会导致任何滚动到取消选择的行。

于 2012-12-13T14:19:35.537 回答