1

我想知道如果 AlertView 已经在屏幕上可见一段时间而没有收到用户的任何确认,它是否有可能超时,如果是这样,怎么办?有没有办法让 AlertView 对象与 NSTimer 对象链接?

我的基本 AlertView 代码如下:

- (IBAction)showMessage:(id)sender {
    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Hello World!"
                                                      message:@"This is your first UIAlertview message."
                                                     delegate:nil
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:nil];
    [message show];
}
4

5 回答 5

4

这就是我在我的一个应用程序中实现的方式

在 @interface 中声明您的对象,以便您可以跟踪它们并在需要时添加

@property (nonatomic, strong) UIAlertView *myAlert;
@property (nonatomic, weak) NSTimer *myTimer;

在您需要启动警报的代码中添加以下内容

self.myAlert = [[UIAlertView alloc]initWithTitle:@"TEST" message:@"TEST" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
self.myTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(cancelAlert) userInfo:nil repeats:NO];
[self.myAlert show];

在您的代码中的某处添加下一个函数以解除警报并使 NSTimer 无效

- (void)cancelAlert {
[self.myAlert dismissWithClickedButtonIndex:-1 animated:YES];
}

如果触摸按钮,请记住使计时器无效。

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {
[self.myTimer invalidate];
// Process pressed button
}

它可能需要根据您的要求进行一些调整。

于 2012-12-08T04:41:26.320 回答
1

是的。采用dismissWithClickedButtonIndex:animated:

例如,使用 dispatch_after 块,如下所示:

int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [message dismissWithClickedButtonIndex:message.cancelButtonIndex animated:YES];
});

如果您想使用 NSTimer,只需将其保存UIAlertView在实例变量中,以便您可以从 timer 方法中访问它。

于 2012-12-07T22:03:13.007 回答
1

您可以为它创建一个类别UIAlertView并添加一个监听器,如果它被触发,则会自行删除:

@implementation UIAlertView (Cancellable)

+ (instancetype)cancellableAlertViewWithTitle:(NSString *)title
                                      message:(NSString *)message
                                     delegate:(id)delegate
                            cancelButtonTitle:(NSString *)cancelButtonTitle
                            otherButtonTitles:(NSString *)otherButtonTitles, ...
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                        message:message
                                                       delegate:delegate
                                              cancelButtonTitle:cancelButtonTitle
                                              otherButtonTitles:nil];
    if (otherButtonTitles != nil)
    {
        va_list args;
        va_start(args, otherButtonTitles);
        for (NSString *buttonTitle = otherButtonTitles; buttonTitle != nil; buttonTitle = va_arg(args, NSString*))
        {
            [alertView addButtonWithTitle:buttonTitle];
        }
        va_end(args);
    }

    [[NSNotificationCenter defaultCenter] addObserver:alertView selector:@selector(removeAlertView:) name:@"AlertsShouldBeCancelledNotification" object:nil];

    return alertView;
}

- (void)removeAlertView:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self dismissWithClickedButtonIndex:-1 animated:YES];
}

@end

然后你可以NSTimer在你的主类中创建一个并让它在调用选择器时触发通知。

于 2015-04-24T16:35:05.470 回答
0

dismissWithClickedButtonIndex:animated:如果用户及时单击,请使用 NSTimer 调用并使其无效。如果用户已经解除了消息,则使用 dispatch_after 可能会将消息发送到已发布的实例。

于 2012-12-07T22:09:16.963 回答
0

看看这个答案:dismissing a UIAlertView programmatically。在我看来,使用performSelector:withObject:afterDelay:比构建和拆除计时器要优雅得多。

于 2013-07-17T20:00:03.127 回答