解雇UIAlertView而不将其作为属性

时间:2014-02-11 11:04:13

标签: ios objective-c uialertview

我有UIAlertView我没有按钮显示。我想在处理一些操作后以编程方式解除它(这是一个“请稍候”警告对话框)。不过,我想解雇它,而不需要UIAlertView成为财产。

为什么:现在我将警报视图分配给@property - 例如:我正在创建一个类变量。我不觉得它应该这样 - 因为坦率地说,它只在View Controller加载时显示。我认为它以某种方式添加为子视图,我可以在加载完成后从堆栈中弹出它,但这不起作用。

什么:我创建了警告对话框(没有按钮)并显示它。然后我开始处理数据 - 与服务器同步。它只发生过一次并且不常见。但是,其他对象负责同步,并作为观察者模式实现 - 对象本身在加载数据时报告。那是我解雇对话的时候。我只是想避免在对话框中使用@property。

我就是这样做的(简化):

@property (nonatomic, strong) UIAlertView *av;

- (void)setup {
       ...
       [self.av show];
       [self loadData];
}

- (void)loadData {
       ...loading data...
       [self.av dismissWithClickedButtonIndex:0 animated:YES];
}

有没有办法解雇它而无需将其“存储”到@property

1 个答案:

答案 0 :(得分:1)

Blocks保留它们捕获的变量。你可以利用这种行为,但你应该了解你在那里做的事情:

UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Title"
                                             message:@"Message"
                                            delegate:nil
                                   cancelButtonTitle:nil
                                   otherButtonTitles:nil];
[av show];

dispatch_async(dispatch_queue_create("com.mycompany.myqueue", 0), ^{
    sleep(5);
    dispatch_async(dispatch_get_main_queue(), ^{
        [av dismissWithClickedButtonIndex:0 animated:YES];
    });
});

sleep(5)只是模拟你的长期任务。

我没有使用UIAlertView,而是考虑使用这样的库:https://github.com/jdg/MBProgressHUD