2017-06-07 30 views
0

社區!如何獲取ViewController的參考

我有一個關於Swift 3和Xcode中引用的問題。 我的計劃是這樣的:

目前我的應用程序有4個控制器。一個MapViewController,一個PositionController,一個MarkerController和一個APIDataController。那些當然處理各自的模型。現在我的問題出現了,當我想要控制器進行通信時。看看這個代碼(請忽略,大部分功能都沒有在這裏實現):

首先我MarkerController:

import Foundation 

protocol MarkerControllerDelegate: class{ 
    func willGetMarkerArray() 
    func didGetMarkerArray(_ newMarkerArray: Marker) 
} 

class MarkerController: NSObject{ 

    var markerArray = [Marker]() 
    weak var delegate: MarkerControllerDelegate? 

    func createMarkerArray(){ 

    } 

    func getMarkerArray() -> [Marker]{ 
     return markerArray 
    } 
} 

extension MarkerController : APIDataControllerDelegate{ 
    func didRetriveAPIData(_ APIDataModelArray: APIDataModel) { 
     createMarkerArray() 
    } 
} 

現在我APIDataController:

import Foundation 

protocol APIDataControllerDelegate: class{ 
    func didRetriveAPIData(_ APIDataModelArray: [APIDataModel]) 
} 

class APIDataController: NSObject { 

    var APIDataModelArray = [APIDataModel]() 
    weak var delegate: APIDataControllerDelegate? 

    func retriveAPIData(){ 
     //get the data 
     //..... 
     //finished getting data 
     delegate?.didRetriveAPIData(APIDataModelArray) 
    } 

    func getAPIDataModelArray() -> [APIDataModel] { 
     return APIDataModelArray 
    } 
} 

而且終於開始我的MapViewController:

import UIKit 
import GoogleMaps 
import GoogleMaps 
import CoreLocation 

class MapViewController: UIViewController{ 

    let positionController = PositionController() 
    let apiDataController = APIDataController() 
    let markerController = MarkerController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     apiDataController.retriveAPIData() 
     //blablabla 
    } 
    //blablablabla 
} 

現在,這可能是很多代碼一次,所以讓我解釋一下應該發生什麼:

在開始處(或代碼中的任何地方)MapViewController調用retrieveAPIData方法。一旦函數完成,APIDataController計劃通過APIDataControllerDelegate-Protocol通知MarkerController開始他的工作(運行他的createMarkerArray-Method)。

現在,要做到這一點,我必須將一個markerController-Instance聲明爲一個委託給APIDataController。現在,因爲我已經在mapViewController中創建了所有控制器的實例,所以我希望在需要時將這些引用提供給其他控制器,以便它們都引用相同的實例,類似於Singleton。

但是,我怎麼創建一個參考的MapViewController我在我的MapViewController,將它傳遞給我的其他控制器,以便他們可以從那裏像:

let positionController = mapViewController.positionController? 

沒有我試着似乎工作。所以任何幫助,將不勝感激。 此外,如果有更好的方法讓我的控制器進行通信,我向他們開放,我確信有比現在嘗試做的更好的方法。

+0

使用委託進行控制器之間的通信是推薦的方式。設置代表取決於這些控制器在您的應用程序中進行交互的方式。通常你會從一個應用程序到另一個應用程序,這是設置代表的好機會。您也可以在彙集視圖的代碼中完成此操作。 – Gerriet

+0

你的回答實際上對我有很大的幫助:D我現在只是將參考資料提供給Method-Calls中的代表,它的工作原理。 – Regicide

回答

0

使用委託進行控制器之間的通信是推薦的方法。設置代表取決於這些控制器在您的應用程序中進行交互的方式。通常你會從一個應用程序到另一個應用程序,這是設置代表的好機會。您也可以在代碼中放置您的視圖