社区!
我对Swift 3和Xcode中的References有疑问。 我的计划是这样的:
目前我的应用程序有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 :(得分:0)
建议使用Delegates进行控制器之间的通信。设置委托取决于这些控制器在您的应用程序中的交互方式。通常你会有一个从一个应用程序到另一个应用程序的segue,这是设置代表的好机会。您也可以在将视图放在一起的代码中执行此操作