代码:
await vc.PresentViewControllerAsync(otherVC, true);
someMethod();
我希望它能等到显示的otherVC
退出。这就是为什么缺少非异步版本的最后一个参数,对吗?因为它应该是someMethod
。但实际上,上面的代码仅显示otherVC
,并立即运行someMethod
。
如果应该阻止 -为什么还要阻止它?为什么不只有PresentViewController
?
答案 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();
});