Делегат и обратный вызов не работают для передачи данных модели - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь передать данные из первого виртуального контейнера во второй виртуальный канал. Я пытался использовать делегат, но он никогда не работал (не показывал требуемый ответ), поэтому я тоже попробовал обратный вызов, и теперь он работает, поэтому я вставляю обе строки кода так, любая помощь приветствуется

Делегат:

protocol RatingDelegate: class {
    func didLoadRating(ratings : [RatingModel])
}

viewcontroller, с которого будут передаваться данные

ViewController A:

var delegate : RatingDelegate?
func showRatings(ratings: [RatingModel]) {

        if delegate != nil {
            delegate?.didLoadRating(ratings: ratings)
        }
    }

где мне должно быть напечатано значение делегата

RatingVC:

extension RatingVC: RatingDelegate {
    func didLoadRating(ratings: [RatingModel]) {
        log(ratings)
    }

}

Версия обратного вызова

Контроллер представления, который получит данные

var ratingsCallBack: (() -> ([RatingModel]))?

контроллер представления, из которого будет передано значение

func showRatings(ratings: [RatingModel]) {

        let ratingVC = RatingVC()
        ratingVC.ratingsCallBack!() = {[unowned self] in
            return ratings
        }
    }

это как бы выдает ответ, говорящий

Выражение не присваивается: вызов функции возвращает неизменное значение

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Итак, FirstVC передает данные в RatingVC.

На FirstVC, в тот момент, когда вы вызываете RatingVC, вы должны назначить делегата.

let ratingVC = RatingVC()
self.delegate = ratingVC //Here you specify RatingVC is the delegate variable

self.present(ratingVC, animated: true)

также

if delegate != nil {

}

не требуется, просто сделайте delegate?.didLoadRating(ratings: ratings), чтобы сохранить его в чистоте


РЕДАКТИРОВАТЬ: Поскольку версия обратного вызова такая же, просто присвойте значение обратному вызову перед инициализацией контроллера представления, который отправляет данные.

0 голосов
/ 04 июня 2019

Это выглядит странно:

var ratingsCallBack: (() -> ([RatingModel]))?

должно выглядеть примерно так:

var ratingsCallBack: (([RatingModel]) -> ())?

, поэтому в случае с обратным вызовом:

class A: UIViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let ratingVC = RatingVC()
        ratingVC.ratingsCallBack = { arr in
            arr.forEach({ (model) in
                print(model.rating)
            })
        }
        navigationController?.pushViewController(ratingVC, animated: false)
    }
}

class RatingVC: UIViewController {

    var ratingsCallBack: (([RatingModel]) -> ())?

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }

    @IBAction private func someButtonAction(_ sender: Any) {
        let arr = [RatingModel.init(rating: 5), RatingModel()]
        ratingsCallBack?(arr)
    }
}

struct RatingModel {
    var rating: Int = 1
}

Затем при нажатии"someButton" вы получаете этот массив в контроллере "A"

...