一个单元格中的UIViewController与Swift一起显示两个单元格

时间:2018-04-17 09:47:12

标签: ios swift

我有相同的代码,结果不是喜欢的。我是斯威夫特的新人。我尝试过不同的方法,但它不起作用。帮助解决问题并获得理想的结果。

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

    }

}

这是它的外观

enter image description here

以下是它应该如何看待

enter image description here

3 个答案:

答案 0 :(得分:0)

由于您的期望是d#d = 2d,但您设置的集合单元的计数仅为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
}

答案 1 :(得分:0)

请仔细阅读集合视图单元格委托和数据源方法,以及它的工作原理。

根据您的代码,似乎如果字符串具有#value,那么它应该分开并且应该添加单元格数字。

为了在tableview方法调用之前执行#separator逻辑。 永远记住,将根据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)
    }
}

答案 2 :(得分:0)

而不是直接使用字符串数组首先制作模型而不是解决逻辑并直接将模型数组提供给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
}

现在你可以将[Item]的数组提供给你从上面的函数

获得的集合
let items = getRequiredData(["aa","bb","cc","d#d","ee","ff"])

将项目用作集合视图的数据,并根据

等项目的值设置单元格和值的颜色
cell.myLabel.text = self.items[indexPath.row].value
cell.backgroundColor = (self.items[indexPath.row].value ?? false) ? UIColor.orange : UIColor.blue