Передача данных с делегатом из замыкания

У меня есть два контроллера представления, и я пытаюсь передать данные от одного к другому. Данные возвращаются из замыкания MKLocalSearch. Но я не могу заставить мой метод делегата работать. Я надеюсь, что кто-то может пролить свет на это? Я смоделировал уменьшенную версию того, что я пытаюсь сделать. Кроме того, я не использую раскадровки. Я кодирую все. Вот код...

import UIKit
import MapKit

protocol SendDataDelegate {
    func sendData(data: String)
}

class OneViewController: UIViewController {

var delegate: SendDataDelegate?

override func viewDidLoad() {
    super.viewDidLoad()

    doSearch() { coord in
        if let coord = coord {
            //When the execution gets here, coord does have
            //the values to be sent to the nexr view controller.
            self.delegate?.sendData(data: "\(coord)")
            let twoViewController = TwoViewController()
            self.present(twoViewController, animated: true)
        }
    }
}

func doSearch(completion: @escaping (CLLocationCoordinate2D?) -> Void) {

    var coord: CLLocationCoordinate2D?
    let request = MKLocalSearchRequest()

    request.naturalLanguageQuery = "New York"

    let search = MKLocalSearch(request: request)

    search.start(completionHandler: {(response, error) in

        if error != nil {
            print("Error occured in search:\(error!.localizedDescription)")
        } else if response!.mapItems.count == 0 {
            print("No matches found")
        } else {
            print("Matches found")

            coord = response?.mapItems[0].placemark.coordinate
        }
        completion(coord)
    })
  }
}

import UIKit

class TwoViewController: UIViewController, SendDataDelegate {

var myData: String = ""
var oneViewController = OneViewController()

override func viewDidLoad() {
    super.viewDidLoad()
    oneViewController.delegate = self
}

func sendData(data: String) {
    myData = data
    print ("myData: \(myData)")
}

}

1 ответ

Решение

В вашем TwoViewController, у вас есть свойство, содержащее другой экземпляр OneViewController и установив его делегат self,

Итак, каждый раз, когда вы создаете экземпляр TwoViewControllerновый экземпляр OneViewController создан, но ни один из них на самом деле не из-за того, что показывает фактический вид OneViewController,

В вашем случае шаблон делегата не подходит, и вам лучше вызвать метод TwoViewController непосредственно:

class OneViewController: UIViewController {

    //no need to have a delegate

    override func viewDidLoad() {
        super.viewDidLoad()

        doSearch() { coord in
            if let coord = coord {
                //When the execution gets here, coord does have
                //the values to be sent to the nexr view controller.
                let twoViewController = TwoViewController()
                twoViewController.sendData(data: "\(coord)")
                self.present(twoViewController, animated: true)
            }
        }
    }

    //...    
}

class TwoViewController: UIViewController {

    var myData: String = ""
    //Creating a new instance of `OneViewController` has no meaning.

    override func viewDidLoad() {
        super.viewDidLoad()
        //Useless to set the delegate of newly created `OneViewController`.
    }

    func sendData(data: String) {
        myData = data
        print ("myData: \(myData)")
    }

}

Если у вас есть причина иметь недвижимость oneViewController в TwoViewControllerПожалуйста, объясните почему. Ваш текущий код ничего не объясняет.

Другие вопросы по тегам