【问题标题】:Next object instance IGListKit下一个对象实例 IGListKit
【发布时间】:2020-05-21 08:23:31
【问题描述】:

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

我希望 下一个对象 中的一个实例在当前单元格中设置标签文本 cell.Label.text = Talent(nextIndex).name //

尝试过:将数组输入传递给 SectionController 以用作 人才[指数+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
  }
}

【问题讨论】:

    标签: swift uicollectionview uicollectionviewcell uicollectionreusableview iglistkit


    【解决方案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 中的人才数组,并在ListAdapterDataSource 下的objects() 中返回视图模型数组。然后,在您的部分控制器中,您将通过视图模型获得下一个人才的信息。

    资源: ListKit Modeling and Binding (谈论 ListBindingSectionController,但也有助于阅读对模型和节控制器关系的一般理解), ListKit best practices

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多