为什么PresentViewControllerAsync不阻止?

时间:2019-11-18 18:56:09

标签: c# ios xamarin xamarin.ios

代码:

await vc.PresentViewControllerAsync(otherVC, true);
someMethod();

我希望它能等到显示的otherVC退出。这就是为什么缺少非异步版本的最后一个参数,对吗?因为它应该是someMethod。但实际上,上面的代码仅显示otherVC,并立即运行someMethod

如果应该阻止 -为什么还要阻止它?为什么不只有PresentViewController

2 个答案:

答案 0 :(得分:1)

基于文档(我不使用Xamarin):

PresentViewControllerAsync异步显示一个视图控制器-表示不会阻塞,下一行将在 期间执行 > 正在呈现

PresentViewController具有完成处理程序-意思是,将 显示 然后 呈现otherVC完成块将运行。 (请注意,完成块将在VC的表示完成后运行...在关闭所显示的VC后, 不是 )。 / p>

答案 1 :(得分:0)

PresentViewControllerAsync 是一种Asynchronous方法。通常,它出现在任务方法中,最后您要返回UI线程以显示视图控制器。如果不在任务方法中,则无需使用它。 简而言之,如果您需要在任务方法中调用当前视图控制器的UI方法,则Xamarin提供了这样一种简单方法。

  

如果不应该阻止-为什么还要阻止它?为什么不只有PresentViewController?

关于这个疑问,我想也许您只是想知道在哪里需要使用此metbod。我想说的是,使用自定义渲染器调用本机方法时,有时会在Xamarin Forms中使用此方法。

例如,如果要与Xamarin Forms共享对话框,要激活内置共享对话框,我们需要在每个平台上实现。首先,让我们创建一个接口,以便我们从可移植库中调用它。

public interface IShare
{
    Task Show(string title, string message, string filePath);
}

然后 iOS 将此称为“活动视图”。创建一个UIActivityViewController,填充相关的详细信息并显示。

public class Share : IShare
{
    // MUST BE CALLED FROM THE UI THREAD
    public async Task Show(string title, string message, string filePath)
    {
        var items = new NSObject[] { NSObject.FromObject(title), NSUrl.FromFilename(filePath) };
    var activityController = new UIActivityViewController(items, null);
    var vc = GetVisibleViewController();

    NSString[] excludedActivityTypes = null;

    if (excludedActivityTypes != null && excludedActivityTypes.Length > 0)
        activityController.ExcludedActivityTypes = excludedActivityTypes;

    if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
    {
        if (activityController.PopoverPresentationController != null)
        {
            activityController.PopoverPresentationController.SourceView = vc.View;
        }
    }
    await vc.PresentViewControllerAsync(activityController, true);      
    }

    UIViewController GetVisibleViewController()
    {
        var rootController = UIApplication.SharedApplication.KeyWindow.RootViewController;

    if (rootController.PresentedViewController == null)
        return rootController;

    if (rootController.PresentedViewController is UINavigationController)
    {
        return ((UINavigationController)rootController.PresentedViewController).TopViewController;
    }

    if (rootController.PresentedViewController is UITabBarController)
    {
            return ((UITabBarController)rootController.PresentedViewController).SelectedViewController;
    }

    return rootController.PresentedViewController;
    }
}

现在在这里您可以看到必须从UI任务中调用Controller,因此需要使用异步方法来调用它。那只是我的理解,如果以后其他人给出更多的观点,那会更好。

另外

如果要先运行,请运行somemethod。也许您可以尝试这种方法:

UIViewController.PresentViewController(UIViewController, Boolean, Action)

在演示文稿完成后,它具有完成操作要执行。

用法如下:

this.PresentViewController(new UIViewController(), true, () => {
    SomeMethod();
});