Ios 一个单元格中的UIViewController使用Swift同时显示两个单元格

Ios 一个单元格中的UIViewController使用Swift同时显示两个单元格,ios,swift,Ios,Swift,我有相同的代码的结果是不一样的。我是斯威夫特的新手。我试过不同的方法,但都不管用。帮助解决问题并获得预期结果 import UIKit class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { let arr = ["aa","bb","cc","d#d","ee","ff"] func collectionView(_ collectionV

我有相同的代码的结果是不一样的。我是斯威夫特的新手。我试过不同的方法,但都不管用。帮助解决问题并获得预期结果

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    let arr = ["aa","bb","cc","d#d","ee","ff"]

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

        return arr.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath as IndexPath) as! MyCollectionViewCell


        let fullNameArr = arr[indexPath.item].split(separator: "#") as [AnyObject]


        let firstName = fullNameArr as! [String]

        let os = firstName.count

        if (os > 1){


            if os == 2{

                cell.myLabel.text = firstName[0]

                cell.backgroundColor = UIColor.red


            }else{

                cell.myLabel.text = firstName[1]

                cell.backgroundColor = UIColor.blue

            }

        }else{

            cell.myLabel.text = arr[indexPath.item]

            cell.backgroundColor = UIColor.orange

        }

        return cell

    }

}
这是它看起来的样子

下面是它最后的样子


因为您期望的是d#d=2d,但您将collectioncell的计数设置为仅1。 您可以先简单地处理数组,并保留所有代码

var arr = ["aa","bb","cc","d#d","ee","ff"] // Change let to var
// Break all x#x -> x# + x#
arr = arr.reduce([]) { (res, str) -> [String] in
    var result = res
    var comps = str.components(separatedBy: "#")
    if comps.count > 1 {
        comps = comps.map({$0 + "#"})
    }
    result.append(contentsOf: comps)
    return result
}

请详细介绍集合视图单元格委托和数据源方法,以及它的工作原理

根据您的代码,若字符串有#值,那个么它应该被分隔,并且应该添加单元格编号

为此,请在调用tableview方法之前实现#分隔符逻辑。 始终记住,单元格将根据您在numberOfItemsInSection数据源方法中返回的项数创建

使用以下代码获取更新的阵列:-

let newArr:[String] = [String]()
for data in arr {
    let numberOfStr = data.split(separator: "#") as [String]
    if numberOfStr.count > 1 {
         for data in numberOfStr {
              newArr.append(data)
         }
    } else {
        newArr.append(data)
    }
}

与其直接使用字符串数组,不如先建立一个模型,然后求解逻辑,直接将模型数组交给collectionview来设置数据

将包含数据的模型类

class Item {
  var value: String?
  var isColored: Bool?

  init(value: String?, isColored: Bool) {
    self.value = value
    self.isColored = isColored
  }
}
解决上述问题的逻辑函数

func getRequiredData(_ arr: [String]) -> [Item] {
      var newItems = [Item]()
      arr.forEach({newItems.append(Item.init(value: $0, isColored: false))})

      newItems.forEach { (item) in
        if /item.value?.contains("#") {
          let dividedItems = (/item.value).split(separator: "#")
          dividedItems.forEach({newItems.append(Item.init(value: /String($0 ?? ""), isColored: true))})
        }
      }
      let filteredArray = newItems.filter({!(/$0.value?.contains("#"))})
      let sortedArray = filteredArray.sorted(by: { /$0.value < /$1.value })
      return sortedArray
}
使用项作为数据来收集视图,并根据项的值设置单元格的颜色和值,如

cell.myLabel.text = self.items[indexPath.row].value
cell.backgroundColor = (self.items[indexPath.row].value ?? false) ? UIColor.orange : UIColor.blue

非常感谢。都坏了(如我所愿)
cell.myLabel.text = self.items[indexPath.row].value
cell.backgroundColor = (self.items[indexPath.row].value ?? false) ? UIColor.orange : UIColor.blue