ios - 如何获取 ViewController 的引用

标签 ios swift xcode

社区!

我有一个关于 Swift 3 和 Xcode 中的引用的问题。 我的计划是这样的:

目前我的应用程序有 4 个 Controller 。一个 MapViewController、一个 PositionController、一个 MarkerController 和一个 APIDataController。这些当然处理各自的模型。当我希望 Controller 进行通信时,我的问题就出现了。看一下这段代码(请忽略这里大部分功能都没有实现):

首先是我的 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 的委托(delegate)。现在,由于我已经在 mapViewController 中创建了所有 Controller 的实例,因此我想在需要时将这些引用提供给我的其他 Controller ,以便它们都引用相同的实例,有点像单例。

但是,如何在 MapViewController 中创建对 MapViewController 的引用,将其传递给我的其他 Controller ,以便它们可以从那里开始:

let positionController = mapViewController.positionController? 

我尝试过的似乎都不起作用。因此,任何帮助将不胜感激。 另外,如果有更好的方法让我的 Controller 进行通信,我对此持开放态度,我确信有比我目前尝试做的更好的方法。

最佳答案

建议使用委托(delegate)在 Controller 之间进行通信。设置委托(delegate)取决于这些 Controller 在您的应用程序中交互的方式。通常,您会从一个应用程序切换到另一个应用程序,这是设置委托(delegate)的好机会。您还可以在将您的 View 组合在一起的代码中执行此操作

关于ios - 如何获取 ViewController 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44418987/

相关文章:

xcode - 10.8 上使用了错误的本地化,10.10 上一切正常

iphone - 在 UIToolBar 中垂直移动 UIBarButtonItems

ios - xcode 8 w/jenkins xcode 插件,如何指定配置文件

ios - 如何使用证书从 xcode 创建 .ipa?

objective-c - 使用 Array 观察键值不做任何事情

iphone - 将 iPhone 存档交给经销商

ios - 设计模式 : exposing notifications using a protocol

swift - 快速进行轮询的正确方法?

ios - 动画时将 UITableViewCell 子 UIImageView 置于前面

ios - Cloudkit 查询时间 -