【问题标题】:Passing Data to collectionView(numberOfItemsInSection) function (Swift)将数据传递给 collectionView(numberOfItemsInSection) 函数 (Swift)
【发布时间】:2017-07-02 03:15:59
【问题描述】:

我在将数据从模型传递到集合视图时遇到问题。我已将代码简化为一个简单的项目来说明问题,可在此处获得:https://github.com/routineCode/collectionViewDataProblem

这是一张使用当前代码显示期望结果与实际结果的图像: View Controller output showing Desired vs. Actual Result

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

【问题讨论】:

    标签: ios swift uicollectionview parameter-passing


    【解决方案1】:

    设置 ViewController 后尝试 reloadData

    lazy var menuBar: MenuBar = {
        let mb = MenuBar()
        mb.viewController = self
        mb.cView.reloadData()
        return mb
      }()
    

    顺便说一下,你的代码有内存泄漏问题

    保留圈子

    Retain circle 是指两个对象之间具有强引用,因此没有人永远不会释放。 Here 是一个与您完全相同的保留圈示例。

    在您的代码中,ViewController 强烈引用了 menuBar

    lazy var menuBar: MenuBar ...
    

    而且MenuBar对ViewController有强引用

    var viewController: ViewController?
    

    你可以将 viewController 属性设置为weak,但是你给整个ViewController什么呢?为什么你的 menuBar 应该知道整个 viewController?您可以只删除 viewController 属性并给它一个 data 属性。

    let data = [String]()
    

    并将其设置在您的 viewController 中

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

    【讨论】:

    • 您添加行 mb.cView.reloadData() 的建议有效。谢谢。
    • 关于您的其他 cmets:我只发布了足够的代码来显示问题。在我的原始代码中,有一个像这样的函数调用 viewController.scrollToMenuInde​​x(indexPath.item) 我知道如何进行此类调用的唯一另一种方法是使用静态函数,但是当我尝试让它工作时遇到问题.因此,我采纳了您的建议,在 MenuBar 类中使用弱 var viewController。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多