使用DecelerationEnded会干扰其他回调

时间:2012-05-31 10:42:26

标签: c# ios xamarin.ios monotouch.dialog

我正在尝试将 DecelerationEnded 回调与MT.Dialog元素上的' Tapped '回调结合使用。我不能让两人同时工作。

当DecelerationEnded回调被注释掉时,'tapped'回调会起作用。当它被评论时,'tapped'回调不会再被触发(而DecelerationEnded则会被触发)。

当DecelerationEnded调用移动到Root的设置之上时,按钮'tapped'回调会起作用,但DecelerationEnded回调不会。延迟回调设置,直到ViewWillAppear也没有修复任何内容。

任何解决方案?

示例代码:

public class TestController : DialogViewController
{
    public TestController () : base(UITableViewStyle.Plain, null, true)
    {
        // Create list of 20 buttons.
        Section s = new Section();

        for (int i = 0; i < 20; i++ )
        {
            s.Add(new StringElement("test " + i, () => {
                Console.WriteLine("Tapped"); // Tapped callback.
            }));
        }

        Root = new RootElement("Test") {s};

        // The following line causes all the "tapped" handlers to not work.
        this.TableView.DecelerationEnded += HandleDecelerationEnded;
    }

    void HandleDecelerationEnded (object sender, EventArgs e)
    {
        Console.WriteLine ("Deceleration Ended");
    }
}

1 个答案:

答案 0 :(得分:2)

在MonoTouch中,您可以使用C#样式的回调或Objective-C样式的回调,但它们不能混合在一起:

http://docs.xamarin.com/ios/advanced_topics/api_design#Delegates

MonoTouch.Dialog库在内部通过提供处理所有事件的完整子类来实现其功能。如果您使用C#语法,它会使用代理替换内置处理程序,在这种情况下,代理仅响应DecelerationEnded。

如果你想要连接到这个,你需要继承现有的“Source”类,并通过覆盖CreateSizingSource来创建它,它应该提供你的类的新实例。这是您需要覆盖的虚拟方法,以提供相同的行为,但使用您自己的类:

public virtual Source CreateSizingSource (bool unevenRows)
{
    return unevenRows ? new SizingSource (this) : new Source (this);
}

您可以将SizingSource子类化并覆盖减速方法的方法。

TweetStation有一个展示如何完成此操作的示例:它使用相同的事件来确定何时从屏幕上删除未读推文的数量。