Xamarin.ios 像在Windows窗体中一样实现阻塞模式视图/对话框-可能吗?

Xamarin.ios 像在Windows窗体中一样实现阻塞模式视图/对话框-可能吗?,xamarin.ios,Xamarin.ios,简言之: 我希望显示视图或操作表,并且仅在用户取消视图/操作表后继续执行代码。所以:第一行显示视图,第二行读取一些结果变量 详细说明我为什么需要这个: 我正在将Windows窗体应用程序移植到iPad上。最初的实现有一个通信类,它使用web服务与服务器通信。它提供了两种获取数据的方法。方便的是,它会在每次通话前检查用户是否仍然拥有有效的连接,或者出于安全原因是否必须重新输入密码。 如果需要密码,.NET类将显示一个模式对话框,该对话框将阻止任何进一步的代码执行。如果输入了密码,则将重试在显示对话

简言之:

我希望显示视图或操作表,并且仅在用户取消视图/操作表后继续执行代码。所以:第一行显示视图,第二行读取一些结果变量

详细说明我为什么需要这个:

我正在将Windows窗体应用程序移植到iPad上。最初的实现有一个通信类,它使用web服务与服务器通信。它提供了两种获取数据的方法。方便的是,它会在每次通话前检查用户是否仍然拥有有效的连接,或者出于安全原因是否必须重新输入密码。 如果需要密码,.NET类将显示一个模式对话框,该对话框将阻止任何进一步的代码执行。如果输入了密码,则将重试在显示对话框之前进行的最后一次调用

现在使用CocoaTouch,我面临一个问题。我用UIActionSheet替换了显示对话框的代码。工作正常,但代码执行会立即继续,而在Windows窗体中,它会被阻止(显示对话框后,Windows窗体中的下一行是从对话框中读取输入的密码),直到对话框关闭

我尝试了Thread.Sleep(),直到用户解除UIActionSheet,但是Thread.Sleep()也阻止了主循环,甚至无法绘制我的视图

我目前看到的另一种方法是更改已经工作的类中的所有方法,并给它们一个返回值:如果需要密码,请处理它,然后重试

但这意味着,在我的所有代码中,我都必须添加这些检查,因为在任何给定时刻都可能需要密码。这就是为什么它嵌套在Windows窗体的通信类中

还有其他想法吗

勒内是的,这是可能的

为此,您可以手动运行mainloop。我没有直接停止mainloop,因此我运行mainloop 0.5秒,等待用户响应

以下函数显示了如何使用上述方法实现模式查询:

int WaitForClick ()
{
    int clicked = -1;
    var x = new UIAlertView ("Title", "Message",  null, "Cancel", "OK", "Perhaps");
    x.Show ();
    bool done = false;
    x.Clicked += (sender, buttonArgs) => {
        Console.WriteLine ("User clicked on {0}", buttonArgs.ButtonIndex);
 clicked = buttonArgs.ButtonIndex;
    };    
    while (clicked == -1){
        NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5));
        Console.WriteLine ("Waiting for another 0.5 seconds");
    }

    Console.WriteLine ("The user clicked {0}", clicked);
    return clicked;
}

我认为使用async/await的这种方法要好得多,并且不会在旋转设备时冻结应用程序,或者当自动滚动干扰并使您永远陷入RunUntil循环而无法单击按钮时(至少这些问题在iOS7上很容易重现)

任务showmodalaletviewsync(字符串标题、字符串消息、参数字符串[]按钮)
{
var alertView=新的UIAlertView(标题、消息、null、null、按钮);
Show();
var tsc=new TaskCompletionSource();
alertView.Clicked+=(发件人、按钮)=>{
Console.WriteLine(“用户单击了{0}”,buttonArgs.ButtonIndex);
tsc.TrySetResult(buttonArgs.ButtonIndex);
};    
返回tsc任务;
}       

执行阻塞循环时出现问题。我在EntryEnded事件中有此代码,如果用户旋转设备,循环将无法退出,应用程序似乎已挂起。
Task<int> ShowModalAletViewAsync (string title, string message, params string[] buttons)
{
    var alertView = new UIAlertView (title, message,  null, null, buttons);
    alertView.Show ();
    var tsc = new TaskCompletionSource<int> ();

    alertView.Clicked += (sender, buttonArgs) => {
        Console.WriteLine ("User clicked on {0}", buttonArgs.ButtonIndex);      
        tsc.TrySetResult(buttonArgs.ButtonIndex);
    };    
    return tsc.Task;
}