2017-08-21 50 views
0

我正在抓取JSON菜單,並且一旦JSON返回,我想運行menuReady()更新SomeTableViewController類中表的內容。但是下面的代碼似乎不起作用。通過Swift中的不同類調用委託方法

AIM:運行menuReady()一旦返回JSON就更新內容。

問題:menuReady()永遠不會被解僱。

SomeTableViewController.swift

class SomeTableViewController: UITableViewController, MenuModelDelegate { 
    override func viewDidLoad() { 
     menuModel.delegate = self 
    } 
    func menuReady() { 
     // This is NOT fired. 
     print("SomeViewController.menuReady()") 
    } 
} 

MenuModel.swift

protocol MenuModelDelegate : class { 
    func menuReady() 
} 

class MenuModel: NSObject { 
    var delegate:MenuModelDelegate? 
    func getMenu(data: JSON) { 
     // This is fired. 
     print("MenuModel.getMenu()") 
     delegate?.menuReady() 
    } 
} 

呼叫從AnotherViewController當按鈕竊聽

AnotherViewController.swift

class AnotherViewController : UIViewController { 
    func buttonTapped(sender: UIButton!) { 
     // This function is fired. 
     // jsonData is some json data returned from http request 
     let menuModel = MenuModel() 
     menuModel.getMenu(data: jsonData) 
    } 
} 
+1

是'menuModel'在'SomeTableViewController'和'menuModel'在 「其他一些類」 完全相同的對象? –

+0

@PhillipMills不,他們是分開的對象。三個不同的對象。 –

+0

所以,你給委託給的'MenuModel'對象是**不是**和你調用委託方法的那個一樣嗎? –

回答

3

委託方法被設計在其中工作了「一對一」的關係,你想在這裏實現什麼,你有多個將無法正常工作不同地方的MenuModel的不同實例。你應該嘗試初始化MenuModelSomeTableViewController屬性,並使用它像下面這樣:

class SomeTableViewController: UITableViewController, MenuModelDelegate { 

    private let menuModel: MenuModel = MenuModel() 

    override func viewDidLoad() { 
     self.menuModel.delegate = self 
     self.menuModel.getMenu(data: jsonData) 
    } 
    func menuReady() { 
     print("SomeTableViewController.menuReady()") 
    } 
} 

如果你正在尋找將更新多個視圖控制器,然後一個更好的解決辦法是在NotificationCenter讀了一個解決方案。使用通知您可以將觀察者添加到多個視圖控制器/類,並簡單地讓您的MenuModel發佈通知。

https://developer.apple.com/documentation/foundation/notificationcenter

我希望幫助。

0

感謝@PhillipMills指出委託對象應該是同一個對象實例。

這是解決問題的方法。現在委託功能正常工作。

SomeTableViewController.swift

class SomeTableViewController: UITableViewController, MenuModelDelegate { 
    private let menuModel: MenuModel = MenuModel() // <--- Added property 
    override func viewDidLoad() { 
     menuModel.delegate = self 
    } 
    func menuReady() { 
     print("menuReady") 
    } 
    // <--- Added Function 
    func getModel() -> MenuModel {  
     return self.menuModel 
    } 
} 

MenuModel.swift

protocol MenuModelDelegate : class { 
    func menuReady() 
    func getModel() -> MenuModel 
} 

class MenuModel: NSObject { 
    var delegate:MenuModelDelegate? 
    func getMenu(data: JSON) { 
     print("getMenu()") 
     delegate?.menuReady() 
    } 
} 

AnotherViewController。迅速

class AnotherViewController : UIViewController { 
    func buttonTapped(sender: UIButton!) { 
     // jsonData is some json data returned from http request 
     // let menuModel = MenuModel() <--- Removed line 

     /* You need to find a way to pass in someTableViewController 
     * Use the menuModel defined in SomeTableViewController to 
     * Call menuModel.getMenu() instead of defining a new menuModel */ 
     let menuModel = someTableViewController.getModel() 
     menuModel.getMenu(data: jsonData) 
    } 
} 
相關問題