2017-06-07 10 views
0

Community!So erhalten Sie Referenzen für ViewController

Ich habe eine Frage zu Referenzen in Swift 3 und Xcode. Mein Plan ist dies:

Im Moment hat meine App 4 Controller. Ein MapViewController, ein PositionController, ein MarkerController und ein APIDataController. Die behandeln natürlich die jeweiligen Modelle. Mein Problem tritt nun auf, wenn die Controller kommunizieren sollen. Schauen Sie sich diesen Code (Bitte ignorieren Sie, dass die meisten Funktionen sind hier nicht implementiert):

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

Und jetzt meine 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 
    } 
} 

Und schließlich der Beginn meiner 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 
} 

Nun könnte dies eine Menge Code auf einmal sein Lassen Sie mich Ihnen erklären, was passieren soll:

Am Anfang (oder wo auch immer im Code) MapViewController ruft die Methode retrieveAPIData auf. Sobald die Funktion beendet ist, soll APIDataController den MarkerController über das APIDataControllerDelegate-Protokoll benachrichtigen, um seine Arbeit zu starten (führen Sie seine createMarkerArray-Methode aus).

Jetzt, um dies zu tun, muss ich eine markerController-Instanz als Delegat zu APIDataController deklarieren. Da ich in mapViewController bereits Instanzen aller meiner Controller erstellt habe, möchte ich diese Referenzen meinen anderen Controllern geben, wo sie benötigt werden, so dass sie sich alle auf dieselben Instanzen beziehen, ähnlich einem Singleton.

Aber, wie kann ich einen Verweis auf meine MapViewController in meinem MapViewController schaffen, es zu meinen anderen Controller zu übergeben, damit sie von dort aus können wie gehen:

let positionController = mapViewController.positionController? 

Nichts, was ich versuchte, zu funktionieren scheint. So würde jede Hilfe geschätzt werden. Auch wenn es bessere Möglichkeiten gibt, meine Controller kommunizieren zu lassen, bin ich offen für sie, ich bin mir sicher, dass es einen besseren Weg gibt, es zu tun, als ich es derzeit versuche.

+0

Die Verwendung von Delegaten für die Kommunikation zwischen den Controllern ist die empfohlene Vorgehensweise. Das Festlegen der Delegierten hängt davon ab, wie diese Controller in Ihrer App interagieren. Oft haben Sie einen Übergang von einer App zur anderen, das ist eine gute Chance, Delegierte zu setzen. Sie können dies auch in Code tun, der Ihre Ansichten zusammenstellt. – Gerriet

+0

Ihre Antwort hat mir wirklich sehr geholfen: D Ich gebe jetzt nur noch die Referenzen zu den Delegierten in den Method-Calls und es funktioniert. – Regicide

Antwort

0

Die Verwendung von Delegaten für die Kommunikation zwischen den Controllern ist die empfohlene Vorgehensweise. Das Festlegen der Delegierten hängt davon ab, wie diese Controller in Ihrer App interagieren. Oft haben Sie einen Übergang von einer App zur anderen, das ist eine gute Chance, Delegierte zu setzen. Sie können dies auch in Code tun, der Ihre Ansichten zusammenstellt

Verwandte Themen