0

我在嘗試讓我的Objective-C代碼在觸發後續代碼之前適當地等待來自UIAlertView的用戶輸入時遇到了很多麻煩。例如,我有以下代碼:如何在使用UIAlertView時等待用戶響應?

if (!self.currentUser) [self displayLoginUIAlertView]; 
Program *program = [[Program alloc] initWithUser:self.currentUser]; 
[program startProgram]; 

Program是一個自定義對象和其中來自[self displayLoginUIAlertView]用戶輸入設置屬性self.currentUser

我寧願把第二行和第三行(Program *program[program startProgram]alertView:didDismissWithButtonIndex因爲我想限制我的視圖控制器不同類型的警報意見的數量。另外,我寧願不創建我自己定製的全模態UIAlertView對象(就像在線上的一些解決方案似乎建議)

我在尋找的答案將有望超出UIAlertView對象的泛化,並將有助於回答更一般的問題,如何等待在進入下一行代碼之前,需要在Objective-C中完全執行。我還嘗試了以下操作:

if (!self.currentUser) [self displayLoginUIAlertView]; 
while (!self.currentUser) wait(1); 
Program *program = [[Program alloc] initWithUser:self.currentUser]; 
[program startProgram]; 

但是,這(不出所料)會導致無限循環,其中警報視圖永遠不會出現,並且用戶輸入被鎖定。

我已經研究過使用塊,但他們的語法超級困惑。塊是否是解決方案?或者我問錯誤的問題?

+0

你能解釋一下你的意思嗎?我試圖限制不同類型警報視圖在我的控制器中的數量?將代碼放入委託回調中看不到問題所在。 –

回答

6

正確的方法確實是在alertView:didDismissWithButtonIndex:處執行。

但是,您可能想要創建一個對象,可以使用回調塊並充當UIAlertView的代理,但我認爲它比它的價值更麻煩。(您必須將委託對象保留在避免被忽略的實例變量引用)

+0

我發現的關聯對象的一個​​最便利的用法是將短命的委託人的生命期與其委託人的生命期相關聯。例如,'objc_setAssociatedObject(someUIActionSheet,&key,sheetDelegate,OBJC_ASSOCIATION_RETAIN);'那麼就不需要在本地擁有委託(或通過ivar) - 委託者可以是唯一的所有者。 –

+0

是的!我怎麼能忘記這一點。在這種情況下,我可能會發布一些代碼... – nielsbot

+0

OTOH - 他最終會寫出比他想要的更多的代碼行,無論如何:) – nielsbot

3

一般來說,塊是答案,但只有API支持它們。在警報視圖的情況下,他們不會。擴展它們非常容易,以便它們支持塊,例如UIAlertView-Blocks

嘗試告訴運行時「暫停直到」是非啓動器 - 系統的設計目的不是這樣,用戶界面在您從方法返回之前不會運行。你不會以任何方式獲得。

0

蘋果設計此功能不是要中斷程序流程,而是要在方法完成之前立即顯示。

使用UIAlert作爲端點,並在接收警報的按鈕水龍頭的代理內執行分叉。

當方法在調用顯示警告後立即完成時,程序將等待用戶操作,並且委託人將採取控制並且程序流將僅在用戶單擊某事後才重新開始。