Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何获取ViewController的引用_Ios_Swift_Xcode - Fatal编程技术网

Ios 如何获取ViewController的引用

Ios 如何获取ViewController的引用,ios,swift,xcode,Ios,Swift,Xcode,社区 关于Swift 3和Xcode中的引用,我有一个问题。 我的计划是: 目前,我的应用程序有4个控制器。一个MapViewController、一个PositionController、一个MarkerController和一个APIDataController。当然,它们处理各自的模型。现在我的问题来了,当我想要控制器通信时。看看这段代码(请忽略大多数函数都没有在这里实现): 首先,我的MarkerController: import Foundation protocol Marker

社区

关于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()
    }
}
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
    }
}
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
}
现在是我的APIDataController:

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()
    }
}
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
    }
}
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的开头:

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()
    }
}
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
    }
}
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协议通知MarkerController开始工作(运行其CreateMarray方法)

现在,要做到这一点,我必须声明一个markerController实例作为APIDataController的委托。现在,由于我已经在mapViewController中创建了我所有控制器的实例,我想在需要的地方将这些引用提供给我的其他控制器,以便它们都引用相同的实例,有点像一个单例

但是,如何在我的MapViewController中创建对我的MapViewController的引用,以将其传递给我的其他控制器,以便它们可以从那里像这样运行:

let positionController = mapViewController.positionController? 
我试过的似乎都没用。因此,任何帮助都将不胜感激。
此外,如果有更好的方式让我的控制器进行通信,我愿意在这里与他们交流,我确信有比我目前尝试的更好的方式。建议使用代理进行控制器之间的通信。设置代理取决于这些控制器在应用程序中的交互方式。通常你会从一个应用程序切换到另一个应用程序,这是设置代理的好机会。您也可以在代码中执行此操作,该代码将视图组合在一起

建议使用代理在控制器之间进行通信。设置代理取决于这些控制器在应用程序中的交互方式。通常你会从一个应用程序切换到另一个应用程序,这是设置代理的好机会。你的回答实际上帮了我很大的忙:D我现在只在方法调用中给委托引用,它就起作用了。