2017-06-07 5 views
0

コミュニティ!ViewControllerのリファレンスを取得するには

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() 
    } 
} 

そして今、私の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メソッドの実行)。

これを行うには、markerController-InstanceをAPIDataControllerのデリゲートとして宣言する必要があります。さて、私はすでにmapViewController内のすべてのコントローラのインスタンスを作成しているので、必要に応じて他のコントローラへの参照を与えて、それらがすべてSingletonのような同じインスタンスを参照するようにします。私が試した

let positionController = mapViewController.positionController? 

何も動作するようには思えません:私は、私のMapViewControllerで私MapViewControllerへの参照を作成してください、彼らはそこからのように行くことができるように、私の他のコントローラにそれを渡す方法

しかし、。だから、どんな助けもありがとう。 また、私のコントローラーに連絡をとるためのより良い方法がある場合は、私はここでそれを公開しています。私が現在試みているよりも良い方法があると確信しています。

+0

コントローラ間の通信に代理人を使用することが推奨されています。代理人を設定することは、これらのコントローラがあなたのアプリでやり取りする方法によって異なります。あるアプリケーションから別のアプリケーションへのセグを持つことが多いので、デリゲートを設定する良い機会です。また、ビューをまとめるコードで行うこともできます。 – Gerriet

+0

あなたの答えは本当に私を大いに助けました:私はちょうどMethod-Calls NowとIt作品の代議員への参照を与えます。 – Regicide

答えて

0

コントローラー間の通信に代理人を使用することをお勧めします。代理人を設定することは、これらのコントローラがあなたのアプリでやり取りする方法によって異なります。あるアプリケーションから別のアプリケーションへのセグを持つことが多いので、デリゲートを設定する良い機会です。

関連する問題