2015-04-29 90 views
0

我想要使用Swift更新iOS上用戶界面元素的title屬性。在這種情況下,它是一個UIBarButton,但它可能是UILabel,UIButton或其他。目前我使用這個代碼,其中的工作原理:在Swift中動態更新標籤/按鈕標題

func setStatusMessage(barButton: UIBarButtonItem) { 
    let currentVersion = StatusModel.getCurrentVersion() 
    var statusUpdates = [StatusModel]() 
    var statusForCurrentVersion: StatusModel! 
    var statusMessage = String() 

    // check if update required before setting the text 
    checkIfLocalStatusNeedsUpdate() 
    barButton.title = getLocalStatusMessage() 

    // Try to update status anyway... 
    getStatusFromRemoteSource { (statusUpdates) -> Void in 

     for status in statusUpdates { 
      if status.version == currentVersion { 
       statusForCurrentVersion = status 
      } 
     } 

     self.saveStatusFromRemoteSource(statusForCurrentVersion) 
     barButton.title = statusForCurrentVersion.message 
    } 

} 

雖然有效,但是這種解決方案是太醜陋,因爲它確實需要一個用戶界面,被嵌入在我的模型(圖)元素。不完全是一種MVC美.....

我不能簡單地使用return,因爲在獲取遠程狀態之前將返回本地狀態。所以我想我需要某種類型的處理程序/偵聽器/代理(/*getting lost here*/)來動態更新視圖。在這種情況下,這意味着:使用本地存儲的值設置標題,並在收到遠程值時更新它。

以符合MVC的方式處理此場景的最佳方式是從模型代碼中刪除UI元素(從而提高可重用性)?你可以做

回答

0

一箇中間步驟將會在控制器的用戶界面,通過與基準替代barButton參數控制器

barButton.title = statusForCurrentVersion.message 
-> 
self.controller.update(title: statusForCurrentVersion.message) 

這樣,你的代碼被允許增長(更新多個標籤等),但它會帶來更多代碼和更難讀取的代價。

+0

我做了一些實驗,但沒有成功。這個'controller'實例是什麼? XCode給我錯誤,它不知道'controller',這對我來說是有意義的,但是使它成爲當前UIViewController的一個實例也沒有幫助... – Pieter