首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于segmentedControl索引的数据转换方法

基于segmentedControl索引的数据转换方法
EN

Stack Overflow用户
提问于 2019-11-25 07:05:48
回答 2查看 418关注 0票数 0

我试图根据段控件的索引更改collectionView的数据。当我运行我的代码时,我会崩溃。有人能告诉我我在这里做错了什么吗?我在遵循我发现的不同方法。我从崩溃中得到的错误代码是

线程1: EXC_BREAKPOINT (code=1,subcode=0x1da72fde0)

当我尝试在段索引之间切换时,会发生错误。发生在电话线上

代码语言:javascript
复制
cell.trendsLabel.text = maleTrends[indexPath.row]

代码语言:javascript
复制
 func handleSegControlTapped(for header: HomeViewHeaderReusableView)
代码语言:javascript
复制
 var header: HomeViewHeaderReusableView?



    func handleSegControlTapped(for header: HomeViewHeaderReusableView) {

        collectionView.reloadItems(at: collectionView.indexPathsForVisibleItems) 

        switch header.segmentedControl?.selectedSegmentIndex {
        case 0:
            print("Display female trends")

            header.segmentedControl?.selectedSegmentIndex = 0

            let indexPath = IndexPath()
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "homeViewCell", for: indexPath) as! CurrentTrendsCell
            cell.trendsLabel.text = femaleTrends[indexPath.row]
            cell.trendsImageView.image = femaleImages[indexPath.row]

        case 1:
            print("Display male trends")
            header.segmentedControl?.selectedSegmentIndex = 1
            let indexPath = IndexPath()

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "homeViewCell", for: indexPath) as! CurrentTrendsCell
                     cell.trendsLabel.text = maleTrends[indexPath.row]
            cell.trendsImageView.image = maleImages[indexPath.row]

        default:
            break
        }

        collectionView.reloadData()

    }



  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        let segmentedOutlet = header?.segmentedControl

        switch segmentedOutlet?.selectedSegmentIndex {
        case 0: return femaleTrends.count

       case 1: return maleTrends.count

        default: print("opps, cant load data")
        }

        return 0

    }


    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "homeViewCell", for: indexPath) as! CurrentTrendsCell

        let segmentedOutlet = header?.segmentedControl

        switch segmentedOutlet?.selectedSegmentIndex {
        case 0: cell.trendsLabel.text = femaleTrends[indexPath.row]
        cell.trendsImageView.image = femaleImages[indexPath.row]

        case 1: cell.trendsLabel.text = maleTrends[indexPath.row]
        cell.trendsImageView.image = maleImages[indexPath.row]

        default: break

        }
        return cell


    }
代码语言:javascript
复制
  func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "homeViewReuseCell", for: indexPath) as! HomeViewHeaderReusableView

        headerView.delegate = self 
        return headerView
    }

编辑

以下是标题中的代码

代码语言:javascript
复制
class HomeViewHeaderReusableView: UICollectionReusableView {

    @IBOutlet weak var segmentedControl: UISegmentedControl?


    var delegate: HomeSegmentedControl?



     // MARK: Handler
    @objc func handleSegTapped() {
        delegate?.handleSegControlTapped(for: self)
    }



    @IBAction func segmentedTapped(_ sender: Any) {
        handleSegTapped()

        // change data based on female / male


    }


 override func awakeFromNib() {
         super.awakeFromNib()

        segmentedControl?.tintColor = .clear
        segmentedControl?.layer.borderColor = UIColor.clear.cgColor
        segmentedControl?.setBackgroundImage(UIImage(), for: .normal, barMetrics: .default)


        segmentedControl?.setTitleTextAttributes([
            NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 11),
            NSAttributedString.Key.foregroundColor: UIColor.lightGray

            ], for: .normal)

        segmentedControl?.setTitleTextAttributes([
            NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 11) ,
            NSAttributedString.Key.foregroundColor: UIColor.white
            ], for: .selected)


        segmentedControl?.selectedSegmentIndex = 0



    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-25 09:59:41

从来没有,从来没有dequeueReusableCell打过cellForRow/ cellForItem以外的电话。单元将被排除队列,但当方法退出时将被取消分配。与集合/表视图数据源方法不同,单元格不返回任何地方。

编辑:

替换

代码语言:javascript
复制
var header: HomeViewHeaderReusableView?

使用

代码语言:javascript
复制
var selectedSegmentIndex = 0

然后将整个方法handleSegControlTapped替换为

代码语言:javascript
复制
func handleSegControlTapped(for header: HomeViewHeaderReusableView) {
    selectedSegmentIndex = header.segmentedControl!.selectedSegmentIndex
    collectionView.reloadData()
}

由于数据源方法处理分段控件的状态,因此只需重新加载集合视图就足够了。

然后将numberOfItemsInSection更改为

代码语言:javascript
复制
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    switch selectedSegmentIndex {
    case 0: return femaleTrends.count
    case 1: return maleTrends.count
    default: print("opps, cant load data")
       return 0
    }
}

并相应地更改其他数据源方法。

票数 2
EN

Stack Overflow用户

发布于 2019-11-25 09:06:23

根据您对段的选择,只需重新加载collectionView并在cellForItemAt中配置CollectionViewCell

不管您在哪里添加了段控件,只需对操作方法做出真正的反应,并相应地更新集合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59026734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档