使用UIAlertView时如何等待用户响应?

时间:2012-09-07 18:51:55

标签: objective-c modal-dialog uialertview objective-c-blocks wait

在尝试让我的Objective-C代码在触发后续代码之前等待来自UIAlertView的用户输入时,我遇到了很多麻烦。例如,我有以下代码:

if (!self.currentUser) [self displayLoginUIAlertView];
Program *program = [[Program alloc] initWithUser:self.currentUser];
[program startProgram];

其中Program是自定义对象,[self displayLoginUIAlertView]的用户输入设置了属性self.currentUser

我希望将第二行和第三行(Program *program[program startProgram]放入alertView:didDismissWithButtonIndex,因为我试图限制不同类型的数量我的视图控制器中的警报视图。此外,我不想创建自己的自定义全模式UIAlertView对象(因为在线的一些解决方案似乎建议)。

我正在寻找的答案有望超越UIAlertView对象,并且有助于回答更常见的问题,即如何在进入下一行代码之前等待Objective-C中的一行完全执行。我也尝试了以下内容:

if (!self.currentUser) [self displayLoginUIAlertView];
while (!self.currentUser) wait(1);
Program *program = [[Program alloc] initWithUser:self.currentUser];
[program startProgram];

然而,这(不出所料)导致无限循环,其中警报视图从未出现,用户输入被锁定。

我已经研究过使用过块,但是他们的语法非常困惑。块是解决方案吗?或者我问错了问题?

3 个答案:

答案 0 :(得分:6)

正确的方法是在al。

实施alertView:didDismissWithButtonIndex:

但是,您可能想要创建一个可以接收回调块的对象并充当UIAlertView的委托,但我认为它比它的价值更麻烦..(你必须保留你的委托实例变量引用中的对象以防止它被解除)

答案 1 :(得分:3)

一般来说,块就是答案,但只有API支持它们。在警报视图的情况下,它们不会。扩展它们相当容易,以便它们支持块,例如UIAlertView-Blocks

尝试告诉运行时“暂停直到”是非启动的 - 系统不是设计为以这种方式使用,在您从方法返回之前,UI将无法运行。你不会有任何方式。

答案 2 :(得分:0)

apple设计此功能不是为了中断程序流,而是在方法完成之前立即显示。

使用UIAlert作为端点,并在接收警报按钮的委托内执行fork。

当方法在调用显示警报后立即完成时,程序将等待用户操作,代表将采取控制,程序流程将在用户点击某些内容后重新开始。