如何获取ViewController

时间:2017-06-07 17:15:45

标签: ios swift xcode

社区!

我对Swift 3和Xcode中的References有疑问。 我的计划是这样的:

目前我的应用程序有4个控制器。 MapViewController,PositionController,MarkerController和AP​​IDataController。那些当然处理各自的模型。当我希望控制器进行通信时,我的问题就出现了。看看这段代码(请忽略大多数功能都没有在这里实现):

首先是我的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? 

我尝试的任何东西似乎都没有用。所以任何帮助将不胜感激。 此外,如果有更好的方法让我的控制器进行通信,我对他们开放,我相信有一种比我目前尝试做的更好的方法。

1 个答案:

答案 0 :(得分:0)

建议使用Delegates进行控制器之间的通信。设置委托取决于这些控制器在您的应用程序中的交互方式。通常你会有一个从一个应用程序到另一个应用程序的segue,这是设置代表的好机会。您也可以在将视图放在一起的代码中执行此操作