Xamarin加载叠加未显示

时间:2013-06-06 12:59:52

标签: xamarin.ios xamarin

我有一个长时间运行的操作,我想同步运行(我稍后会看到异步)。

我正在使用此处的重叠代码 - http://docs.xamarin.com/recipes/ios/standard_controls/popovers/display_a_loading_message

这是我的测试代码 -

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);

        loadingOverlay = new LoadingOverlay (UIScreen.MainScreen.Bounds);
        View.Add (loadingOverlay);

        int i = 0;
        while (i < 5000)
        {
            Console.WriteLine(i);
            i++;
        }

        loadingOverlay.Hide ();
    }

但是初始叠加没有显示,只有while循环完成后隐藏动画?

我可以像这样制作黑客/解决方法 -

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);

        loadingOverlay = new LoadingOverlay (UIScreen.MainScreen.Bounds);
        View.Add (loadingOverlay);

        NSTimer nstimer = NSTimer.CreateScheduledTimer (1, () => {

            int i = 0;
            while (i < 5000) {
                Console.WriteLine (i);
                i++;
            }

            loadingOverlay.Hide ();
        });
    }

但有人可以向我解释为什么会发生这种情况,以及如何正确编写代码,以便IOS在开始循环之前将覆盖图绘制到屏幕上。

2 个答案:

答案 0 :(得分:4)

你正在阻止你不应该做的UI线程。任何长时间运行的操作都应该在后台线程中运行,即使您想以同步方式处理它。

使用Xamarin.iOS alpha(支持async / await),您的代码将如下所示:

public async override void ViewDidAppear (bool animated)
{
    base.ViewDidAppear (animated);

    loadingOverlay = new LoadingOverlay (UIScreen.MainScreen.Bounds);
    View.Add (loadingOverlay);

    await Task.Factory.StartNew (() => {
        int i = 0;
        while (i < 5000)
        {
            Console.WriteLine(i);
            i++;
        }
    });

    loadingOverlay.Hide ();
}

如果您无法访问async/await,则可以通过以下方式获得相同的结果:

    Task.Factory.StartNew (() => {
        int i = 0;
        while (i < 5000)
        {
            Console.WriteLine(i);
            i++;
        }
    }).ContinueWith(task => InvokeOnMainThread(() => { loadingOverlay.Hide(); }));

但它不太好(同样,检查结束括号,我只输入此代码)

答案 1 :(得分:2)

this Component添加到您的应用程序并完成它。无需重新发明轮子。