2011-10-23 22 views
1

我對目標c有一些樂趣。作爲一個簡單的程序,我想寫一個時鐘應用程序。簡單的時鐘應用程序:每秒使用委託或回調?

基本上,UITextField需要顯示當前時間並每秒更新一次。

我最初的想法是使用委託,並讓UITextField在發生'Value Changed'事件時回調一個類。通過「引導」一個初始值的變化(例如通過設置應用程序啓動的時間),我想我可以在之後不斷地觸發'Value Changed'事件(UITextField會不斷地改變自己,因此觸發委託方法)。我嘗試了很多東西,但是這從來沒有奏效。我甚至嘗試創建一個按鈕,將UITextField設置爲任意文本值(而不是在啓動時設置UITextField),希望調用委託方法,但這也沒有。爲了證明我的代碼是正確的,當我使用'Touch Down'等其他操作時,時間會更新:我會在UITextField中每次點擊時獲得時間。

我最終發現,我可以每秒使用一個回調通過使用[self performSelector ...]並且工作。

我的代表團使用'Value Changed'行爲沒有奏效嗎?

回答

1

值改變的事件僅響應於用戶事件 - 也就是說,您設置您的textField.text = "something"不會通過設計激發它。

它不是很好,因爲它的聲音讓你的應用程序陷入無限循環。如果在設置框中的文本時「值改變」事件確實觸發了,程序會再次詢問委託人,這將再次設置文本,這將再次詢問委託人.....您可以獲得照片。這稱爲無限循環,它具有導致程序掛起然後崩潰的效果,因爲程序執行無法退出此循環。

總之,爲了你在說什麼,你有兩個選擇

  1. 你可以設置一個NSTimer對象調用你的時間更新方法的每一秒。這很容易,查看the documentation

  2. performSelector:withObject:afterDelay:。聽起來你可能已經掌握了這個。它並不像使用NSTimer那麼簡單,但它可以完成這項工作。

+1

太棒了,這是有道理的。對我來說,無限循環只是蘋果公司的總部地址;) – azog

+2

從技術上講,它不會是一個無限循環,它將是一個無限的遞歸,我相信。這導致堆棧溢出。 – morningstar