【问题标题】:Delegate and Callback not working for passing Model data委托和回调不适用于传递模型数据
【发布时间】:2019-06-03 15:10:23
【问题描述】:

我正在尝试将数据从第一个 VC 传递到第二个 VC 我尝试过使用委托,但它从来没有工作过(没有显示所需的响应)所以我也尝试了回调,它现在工作了所以我粘贴了两行代码所以欢迎任何帮助

代表:

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

数据将从其传递的视图控制器

ViewController A:

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

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

委托值应该打印在哪里

评级VC:

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

这怎么会引发回应说

表达式不可赋值:函数调用返回不可变值

【问题讨论】:

  • “我尝试过使用委托,但它从来没有用过(没有显示所需的响应)”:您至少通过了delegate != nil 测试吗?设置好了吗?
  • 您永远不会为 delegate 属性赋值。
  • 仅供参考 - if delegate != nil 检查是不必要的。
  • @rmaddy 我该怎么做?
  • 要修复错误删除括号(和感叹号)ratingVC.ratingsCallBack = { ... }RatingVC() 很可能不是您期望的实例。

标签: ios swift callback delegates


【解决方案1】:

所以 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) 保持干净


编辑:因为回调版本相同,只需在初始化发送数据的视图控制器之前将值分配给回调即可。

【讨论】:

  • RatingVC 是我向 VC 发送数据的那个,我没有从中传递数据
  • 我知道。 RatingVC 是打开第二个 VC 的那个吗?
  • 不,第二个VC打开RatingVC
  • 所以 RatingVC 在这种情况下是第二个 VC
  • 好的,让我们调用第一个 DataOriginVC 和 RatingVC(是目标和第二个 VC)。然后,当您打开 RatingVC 时,您应该分配委托。我会编辑我的答案
【解决方案2】:

看起来很奇怪:

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”中得到这个数组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多