2014-02-11 66 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