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