我有一個關於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?
沒有我試着似乎工作。所以任何幫助,將不勝感激。 此外,如果有更好的方法讓我的控制器進行通信,我向他們開放,我確信有比現在嘗試做的更好的方法。
使用委託進行控制器之間的通信是推薦的方式。設置代表取決於這些控制器在您的應用程序中進行交互的方式。通常你會從一個應用程序到另一個應用程序,這是設置代表的好機會。您也可以在彙集視圖的代碼中完成此操作。 – Gerriet
你的回答實際上對我有很大的幫助:D我現在只是將參考資料提供給Method-Calls中的代表,它的工作原理。 – Regicide