【发布时间】:2011-12-22 11:08:01
【问题描述】:
我想等待通过 PresentModalViewController() 显示的控制器完成其工作,然后再恢复执行(如 WinForms 中的模式对话框)。单点触控如何做到这一点?
我知道 SO 上有一个 similar question,但答案是针对 Objective-C 的,坦率地说,我不明白。
非常感谢。
编辑
这是我尝试的第一个设置,但似乎不起作用:
- 创建一个新项目(单一视图应用程序);
- 添加两个控制器(iPhone View Controller):FirstController和SecondController;第一个控制器覆盖 DismissModalViewControllerAnimated 并在被解除后立即触发 OnFirstFinished 事件;
- 在主控制器中:
...
public partial class TestModalViewController : UIViewController
{
private UIButton button;
private FirstController first;
private SecondController second;
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
button = UIButton.FromType(UIButtonType.RoundedRect);
button.Frame = new RectangleF(0, 0, 100, 50);
button.SetTitle("Test", UIControlState.Normal);
button.TouchUpInside += PresentFirstController;
View.Add(button);
PresentFirstController(null, null);
}
void PresentFirstController (object sender, EventArgs e)
{
bool firstFinished = false;
first = new FirstController();
first.OnFirstFinished += delegate(object s, EventArgs args) {
firstFinished = true;
};
this.PresentModalViewController(first, true);
do
{
NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5));
} while (!firstFinished);
second = new SecondController();
this.PresentModalViewController(second, true);
}
// ...
}
- 在 FirstController 中:
...
public override void DismissModalViewControllerAnimated (bool animated)
{
base.DismissModalViewControllerAnimated (animated);
if(null != OnFirstFinished)
{
OnFirstFinished(this, null);
}
}
在此设置中,执行块(黑色加载屏幕)并且未加载第一个控制器。
如果从 ViewDidLoad() 中删除了对 PresentFirstController() 的调用,则主控制器会正常加载,并且在单击“测试”按钮时会加载第一个控制器。但是,在第一个控制器被关闭后,第二个控制器没有加载 - iOS 似乎不喜欢在关闭另一个控制器后立即呈现模态控制器。这可以通过添加一个小的延迟来解决(但多小仍然安全?),如下所示:
public override void DismissModalViewControllerAnimated (bool animated)
{
base.DismissModalViewControllerAnimated (animated);
NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow(0.2));
if(null != OnFirstFinished)
{
OnFirstFinished(this, null);
}
}
【问题讨论】:
标签: ios xamarin.ios modalviewcontroller