在委托中显示 UIAlertView 失败

Posted

技术标签:

【中文标题】在委托中显示 UIAlertView 失败【英文标题】:Show UIAlertView in delegate fails 【发布时间】:2014-05-22 22:04:40 【问题描述】:

我在它自己的委托中调用 UIAlertView 并且它失败了。代码很简单:

@interface ViewController () <UIAlertViewDelegate>
@property (nonatomic, strong) UIAlertView *alertView;
@end

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];
    self.alertView = [[UIAlertView alloc] initWithTitle:@"Howdy"
                                                message:@"Here's the alert"
                                               delegate:self
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"OK", nil];
    [self.alertView show]; // this shows the 



- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex

    if (buttonIndex == 1) 
        [self.alertView show]; // this does not show the alert again!
    


@end

但是,当我删除时:

[self.alertView show] 

并将其替换为:

[self.alertView performSelector:@selector(show) withObject:nil afterDelay:0.01]

它有效。

这似乎表明即使我在委托方法alertView:didDismissWithButtonIndex: 中,原始UIAlertVIew 也没有完全消除。

虽然这有效,但似乎并不正确。谁能告诉我我做错了什么?

【问题讨论】:

可能同时启动了 2 个动画。解雇和呈现。这将导致两者都失败。 【参考方案1】:

您可能是对的,但我不明白您为什么会再次显示相同的警报。由于您通常不需要保留对警报的引用,因此您可以编写如下方法:

- (void)showAlert 
   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Howdy"
                                                   message:@"Here's the alert"
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel"
                                         otherButtonTitles:@"OK", nil];
    [alert show];

如果您从viewDidAppear 而不是viewDidLoad 调用它也会更好。

【讨论】:

我需要在 UIAlertView 中收集文本,如果用户没有输入文本,我需要再次请求。虽然我想显示相同的警报而不必重新创建它,但我可能必须按照您的建议进行操作。你的可能是最好的答案,但我会在接下来的几个小时内看到其他人的建议。谢谢! 那么更好的方法可能是首先防止解雇,请参阅here。无论哪种情况,似乎都应该提供一些用户反馈,以便他们知道为什么警报不断弹出。 更好的是,在没有输入文本时禁用按钮。见here 您仍然可以在委托方法中获取文本字段,而无需保留对警报的引用。 @David 禁用按钮的解决方案似乎也不错。但是,您应该确保您确实需要警报。它们通常用于指示应用程序出现问题,或者当您要删除一些非常重要的数据而操作表不起作用时将其用作确认对话框。但是,如果您只想请求例如,则不应使用它。用户提供的登录密码,您可以为此使用普通的视图控制器。 我通过使用您的两个建议解决了这个问题。我禁用按钮,直到正确输入信息(很好的建议)并且我不再多次显示相同的警报。非常感谢!

以上是关于在委托中显示 UIAlertView 失败的主要内容,如果未能解决你的问题,请参考以下文章

从登录 UIAlertView 取消时,应用内购买不发送 SKPaymentCancelled

UIAlertView 隐藏/删除时调用的通知或委托

对象在 UIAlertView 委托被调用之前被释放

在 UI 自动化测试中解除警报时未调用 UIAlertView 的委托方法“clickedButtonAtIndex”

有没有简单的方法来处理 UIAlertView 结果而无需委托?

显示蜂窝数据已关闭警报