0

我在尝试让我的 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];

然而,这(不出所料)会导致一个无限循环,其中警报视图永远不会出现并且用户输入被锁定。

我已经研究过使用块,但对它们的语法感到非常困惑。块是解决方案吗?还是我问错了问题?

4

3 回答 3

6

正确的方法确实是执行alertView:didDismissWithButtonIndex:

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

于 2012-09-07T18:57:46.807 回答
3

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

试图告诉运行时“暂停直到”是不可能的 - 系统并非设计为以这种方式使用,UI 将无法运行,直到您从您的方法返回。那样的话你哪儿也去不了。

于 2012-09-07T18:59:00.010 回答
0

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

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

当方法在调用显示警报后立即完成时,程序将等待用户操作,委托将承担控制权,并且程序流程将仅在用户单击某些内容后重新开始。

于 2013-05-18T14:02:48.877 回答