-2

在我的 iOS 7 应用程序中,我需要验证用户是否想从 Cord Data 中删除选定的记录。我在 .h 文件中定义了 UIAlertViewDelegate。这是显示警报的代码:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning"
                                                message:@"Are you sure you want to delete this record?"
                                               delegate:self
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"Delete", nil];
[alert show];

if(alertButtonTapped == 0)
    return;

//  remainder of code to delete record follows (was omitted)

这是检查哪个按钮被点击的代码:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex  {  

alertButtonTapped = [NSNumber numberWithInteger:buttonIndex];
return;
}

问题是显示警报,然后立即通过该方法中的其余代码。我以前从未见过这个;通常它会阻塞,直到用户通过点击其中一个按钮做出响应(至少我认为是这样)。在用户响应之前,我需要做什么才能阻止此警报?(我正在查看 UIAlertView 块,但不确定是否可以完成这项工作,因为它似乎使用了不同的线程)

4

1 回答 1

4

这就是UIAlertView工作原理——它不会阻塞,因此它具有UIAlertViewDelegate实际实现响应的方法。

如果“剩余代码”是他们点击按钮(例如“删除”按钮)后应该发生的事情,那么将所有代码移到委托方法中,例如:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex  {  
    if (buttonIndex != alertView.cancelButtonIndex) {
        // code to delete record
    }
}

编辑 - 添加示例以回答评论

因此,如果您在同一个类中有多个s,您可以使用( is-a )的属性UIAlertView来区分它们。所以它可能是这样的:tagUIViewUIAlertViewUIView

const NSInteger kDeleteAlertTag = 100;  // declared at the top of your .m file, perhaps.

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning"
                                                message:@"Are you sure you want to delete this record?"
                                               delegate:self
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"Delete", nil];
alert.tag = kDeleteAlertTag;
[alert show];

那么您的委托响应可能如下所示:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex  {  
    if (alertView.tag == kDeleteAlertTag) {
        if (buttonIndex != alertView.cancelButtonIndex) {
            // code to delete record
        }
    }
    else if (alertView.tag = kDoSomethingElseAlertTag) {
        DoSomethingElse();
    }
}
于 2014-08-26T17:07:41.563 回答