0

编辑:我是该领域的新手,我没有得到回应。谁能告诉我我是否遗漏了一些信息?或者我该如何改进它?

我想要一个来自下一个对象的实例在我当前的单元格中设置标签文本 cell.Label.text = Talent(nextIndex).name //<- 这种东西

尝试:将数组输入传递给 SectionController 以用作 Talent[index+1] 错误:文件超出范围

我的部分控制器

class SectionController: ListSectionController {

    var talents: Talent!
    weak var delegate: SectionControllerDelegate?

}

extension SectionController {

    override func sizeForItem(at index: Int) -> CGSize {
        guard
            let context = collectionContext
            else {
                return .zero
        }
        let width = context.containerSize.width
        let height = context.containerSize.height
        return CGSize(width: width, height: height)
    }

    override func cellForItem(at index: Int) -> UICollectionViewCell {    

        guard let cell = collectionContext?.dequeueReusableCellFromStoryboard(withIdentifier: "HomeCell",
                                                                              for: self,
                                                                              at: index) as? HomeCell else {
                                                                                fatalError()
        }

        cell.nameLabel.text = talents.name
        cell.descView.text = talents.largeDesc
        cell.shortDesc.text = talents.smallDesc 

//        let nextTalent = talents[index+1]
//        cell.nextIntroFunc(nextlabels: nextTalent)

        return cell
    }

    override func didUpdate(to object: Any) {
        talents = object as? Talent
    }

}

我的 ListAdapterDataSource

extension Home: ListAdapterDataSource {

  func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
    print(talents)
    return talents
  }


  func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any)
  -> ListSectionController {
    return SectionController()
  }

  func emptyView(for listAdapter: ListAdapter) -> UIView? {
    print("emptyView")
    return nil
  }
}

4

1 回答 1

1

talents在部分控制器中不是一个数组。它只是一个单一的Talent,所以调用[index + 1]它会抛出一个错误。(您可能希望将部分控制器中模型的属性重命名为,talent以便减少混淆。)

ListSectionController 的最佳实践是在您的对象模型和部分控制器之间保持 1:1 的关系。如果你想引用下一个对象,你可以创建一个基于它的单元格/视图模型层talent,包括对下一个人才的引用。

例如:

class TalentSectionModel: ListDiffable {
    let talent: Talent
    let nextTalent: Talent?
   
    init(_ talent: Talent, nextTalent: Talent?) {
        self.talent = talent
        self.nextTalent = nextTalent
    }
    
    // whatever properties you want to expose
  
    var name: String {
        return talent.name
    }
   
    // example of exposing info about next talent
    var nextTalentName: String? {
      return nextTalent?.name
    }
  
    // ListDiffable protocol
    // make sure to implement these two so diffing works
    func diffIdentifier() -> NSObjectProtocol {}
    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {}
}

nextTalent如果您不希望截面模型存储整个对象,您也可以只传递下一个人才的必要属性而不传递整个对象。

现在,TalentSectionModel您将映射您的人才数组并在下Home返回一组视图模型。然后,在您的部分控制器中,您将通过视图模型获得下一个人才的信息。objects()ListAdapterDataSource

资源: ListKit 建模和绑定(讨论 ListBindingSectionController,但也有助于了解模型和部分控制器的关系), ListKit 最佳实践

于 2021-03-10T02:35:17.503 回答