Ios 将数据传递到collectionView(numberOfItemsInSection)功能(Swift)

Ios 将数据传递到collectionView(numberOfItemsInSection)功能(Swift),ios,swift,uicollectionview,parameter-passing,Ios,Swift,Uicollectionview,Parameter Passing,我无法将数据从模型传递到集合视图。我已将我的代码简化为一个简单的项目来说明该问题,可在此处获得: 这是一张显示所需结果与当前代码的实际结果的图像: 我希望collectionView(numberOfItemsInSection)函数返回[data]数组中的项数(5),但它返回硬编码值(3)。通过调试,我意识到这是因为调用此函数时viewController总是为nil,但我不知道如何解决这个问题。我还在collectionView(cellForItemAt)函数中使用[data]数组,这很

我无法将数据从模型传递到集合视图。我已将我的代码简化为一个简单的项目来说明该问题,可在此处获得:

这是一张显示所需结果与当前代码的实际结果的图像:


我希望collectionView(numberOfItemsInSection)函数返回[data]数组中的项数(5),但它返回硬编码值(3)。通过调试,我意识到这是因为调用此函数时viewController总是为nil,但我不知道如何解决这个问题。我还在collectionView(cellForItemAt)函数中使用[data]数组,这很好,因为调用该函数时viewController不是nil。谢谢您的帮助。

设置ViewController后,请尝试重新加载数据

lazy var menuBar: MenuBar = {
    let mb = MenuBar()
    mb.viewController = self
    mb.cView.reloadData()
    return mb
  }()
顺便说一下,您的代码存在内存泄漏问题

保留圆圈

“保留圆”是指两个对象彼此具有强引用,因此没有人会取消分配。是一个与您的完全相同的保留圆示例

在代码中,ViewController对菜单栏有很强的引用

lazy var menuBar: MenuBar ...
菜单栏对ViewController有很强的引用

var viewController: ViewController?
lazy var menuBar: MenuBar = {
    let mb = MenuBar()
    mb.data = data
    return mb
  }()
您可以将viewController属性设置为“弱”,但为整个viewController设置什么呢?为什么菜单栏应该知道整个viewController?您只需删除viewController属性并为其指定数据属性即可

let data = [String]()
并在viewController中设置它

var viewController: ViewController?
lazy var menuBar: MenuBar = {
    let mb = MenuBar()
    mb.data = data
    return mb
  }()

设置ViewController后尝试重新加载数据

lazy var menuBar: MenuBar = {
    let mb = MenuBar()
    mb.viewController = self
    mb.cView.reloadData()
    return mb
  }()
顺便说一下,您的代码存在内存泄漏问题

保留圆圈

“保留圆”是指两个对象彼此具有强引用,因此没有人会取消分配。是一个与您的完全相同的保留圆示例

在代码中,ViewController对菜单栏有很强的引用

lazy var menuBar: MenuBar ...
菜单栏对ViewController有很强的引用

var viewController: ViewController?
lazy var menuBar: MenuBar = {
    let mb = MenuBar()
    mb.data = data
    return mb
  }()
您可以将viewController属性设置为“弱”,但为整个viewController设置什么呢?为什么菜单栏应该知道整个viewController?您只需删除viewController属性并为其指定数据属性即可

let data = [String]()
并在viewController中设置它

var viewController: ViewController?
lazy var menuBar: MenuBar = {
    let mb = MenuBar()
    mb.data = data
    return mb
  }()

您关于添加行mb.cView.reloadData()的建议奏效了。谢谢。关于你的附加评论:我只发布了足够的代码来显示问题。在我的原始代码中,有一个类似viewController.scrollToMenuIndex(indexPath.item)的函数调用。我知道如何进行此类调用的唯一其他方法是使用静态函数,但当我尝试使用该函数时,我遇到了一些问题。因此,我接受了您的建议,在MenuBar类中使用弱var viewController。再次感谢。您建议添加行mb.cView.reloadData()有效。谢谢。关于你的附加评论:我只发布了足够的代码来显示问题。在我的原始代码中,有一个类似viewController.scrollToMenuIndex(indexPath.item)的函数调用。我知道如何进行此类调用的唯一其他方法是使用静态函数,但当我尝试使用该函数时,我遇到了一些问题。因此,我接受了您的建议,在MenuBar类中使用弱var viewController。再次感谢。