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

Objective c 使用UIAlertView时,如何等待用户响应?,objective-c,modal-dialog,uialertview,objective-c-blocks,wait,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]; 其中,程序是一个自定义对象,来自[self-displayloginalertvie

在触发后续代码之前,我很难让Objective-C代码适当地等待用户从UIAlertView输入。例如,我有以下代码:

if (!self.currentUser) [self displayLoginUIAlertView];
Program *program = [[Program alloc] initWithUser:self.currentUser];
[program startProgram];
其中,
程序
是一个自定义对象,来自
[self-displayloginalertview]
的用户输入设置属性
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];
然而,这(毫不奇怪)会导致一个无限循环,其中警报视图从未出现,用户输入被锁定


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

正确的方法确实是实现
alertView:diddismisswithbuttonnindex:


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

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


尝试告诉运行时“暂停到”是一个非启动程序-系统不是设计成这样使用的,用户界面在您从方法返回之前不会运行。这样做不会有任何效果。

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

将UIAlert用作接收警报按钮点击的代理内部的端点和分支执行


在调用display alert之后,当该方法立即完成时,程序将等待用户操作,并且委托将假定只有在用户单击某个对象后,控制和程序流才会重新开始。

我发现关联对象最方便的用途之一是将短时间委托的生命周期与其委托人的生命周期联系起来。例如,
objc_setAssociatedObject(someUIActionSheet,&key,sheetDelegate,OBJC_ASSOCIATION_RETAIN);
这样就没有必要在本地(或通过ivar)拥有委托人——委托人可以是唯一的所有者。OTOH--他最终会写出比他希望的更多的代码行:)我不太清楚Ken Haggarty到底在说什么;
DisplayLoginUIlertView
显示模式视图,等待输入或不显示。如果没有,那么a)我看不出它是如何工作的,b)无论如何,后面的几行都是停不下来的。如果是这样,那么停止以下行就不是问题了--
displayloginalertview
内部有问题。再考虑一下--您可以向UIAlertView添加一个类别,以便通过新属性
retainedLegate
或类似的内容轻松设置保留的委托…(以防万一,
objc\u setAssociatedObject()
太难看了)我将关联包装在委托的一个方法中:你能解释一下“我试图限制控制器中不同类型警报视图的数量”是什么意思吗?我看不出将此代码放入委托回调中有什么问题。