社区!
我有一个关于 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/