2014-02-11 34 views
-2

我有一个UIAlertView,我没有按钮显示。我想以编程方式在处理某些操作后将其关闭(这是“请稍候”警报对话框)。但是,我想解雇它,而不需要UIAlertView是一个属性。关闭UIAlertView而不让它属性

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

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

这是我要做的事(简体):

@property (nonatomic, strong) UIAlertView *av; 

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

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

有没有办法如何消除它,而不需要“存储”它@property

+0

你能解释一下你的问题...显然..你怎么不做一个属性的意思.. – BalaChandra

+2

有什么理由你想避免拥有@property?你可以使用[关联对象](http://nshipster.com/associated-objects/),但说实话,这比@property更糟糕。 –

+0

我可以看到混乱 - 抱歉缺乏清晰度。我编辑了这个问题,所以它现在有意义。 – Michal

回答

1

块保留它们捕获的变量。您可以利用这种行为,但你应该明白你在做什么有:

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

+0

我想要使用这种方法,但是我陷入了这样一个事实,那就是现在在睡眠(5)位置的动作现在被实现为观察者模式 - 这个变化被另一个对象报告,它不会'通过询问改变。 – Michal