以编程方式将 UILabel 添加到集合单元,快速

Posted

技术标签:

【中文标题】以编程方式将 UILabel 添加到集合单元,快速【英文标题】:Add UILabels programmatically to a Collection Cell, swift 【发布时间】:2016-03-16 20:04:56 【问题描述】:

我正在尝试在 Collection CellsubView 中添加 UILabel。 但是当我滚动到另一个单元格并返回时,所有 UIlabels 都出现在两个单元格上,有些写在另一个单元格下..

我尝试使用 collectionView.cellForItemAtIndexPath(indexPath) as? CollectionViewCell ,但是当我使用它时 没有显示 UIlabel(我尝试使用断点,它不会在 if 语句之后)

我该如何解决它??

谢谢!!!

  class CollectionView: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate 

        var collection = [PFObject]()

        @IBOutlet weak var collectionView: UICollectionView!

        let sidePadding:CGFloat = 10

        var checkLocation: Bool = false

        override func viewDidLoad()
        
            super.viewDidLoad();
            self.collectionView!.delegate = self
            self.collectionView!.dataSource = self

        

        func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
            return 1
        

        func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
            return self.collection.count
        

        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 


            let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionCell", forIndexPath: indexPath) as! CollectionViewCell

            cell.layer.borderColor = UIColor.lightGrayColor().CGColor
            cell.layer.borderWidth = 0.5
            cell.layer.cornerRadius = 3

            let collectionViewWidth = self.collectionView.bounds.size.width - self.sidePadding * 2
            cell.frame.size.width = collectionViewWidth
            let collectionViewHeight = self.collectionView.bounds.size.height/4.5
            cell.frame.size.height = collectionViewHeight


            // Display the country name
            if let value = self.collection[indexPath.row]["Name"] as? String 
                cell.cellTitle.text = String(Int(indexPath.row)) + "." + value

            

            let width = (cell.bounds.width - 94 - 4*3 - 60 - 20)/4
            let cellheight = CGFloat(6)
            let cellheight1 = CGFloat(6 + 12 + 2)

            var array = [String]()

            if let MWl = collection[indexPath.row]["MW"] as? Int
            
                if MWl == 1 

                    array.append("M")

                 else if MWl == 2 

                    array.append("M")
                    array.append("W")

                


            

            if let JAl = collection[indexPath.row]["JA"] as? Int
            
                if JAl == 1 

                    array.append("Jy")

                 else if JAl == 2 

                    array.append("Jy")
                    array.append("Ac")

                

            

            if let HK = collection[indexPath.row]["HK"] as? Int
            
                if HK == 1 

                    array.append("HB")

                 else if HK == 2 

                    array.append("HB")
                    array.append("Ks")

                
            

            if let SSl = collection[indexPath.row]["SSl"] as? Int
            
                if SSl == 1 

                    array.append("AB")

                 else if SSl == 2 

                    array.append("AB")
                    array.append("CD")

            

            //I tried here too
            //  if let myCell = collectionView.cellForItemAtIndexPath(indexPath) as? CollectionViewCell

            if array.count <= 4 
                for i in 0..<array.count 

                    let taille = CGFloat(i)
                    var si = CGFloat((1+i)*3 + 94 + 30)
                    let label = UILabel() as UILabel
                    label.frame = CGRectMake((si + width*taille), cellheight, width, 12)
                    label.textColor = UIColor(red: 0/255, green: 125/255, blue: 255/255, alpha: 1.0)
                    label.backgroundColor = UIColor.clearColor()
                    label.layer.borderWidth = 0.7
                    label.layer.borderColor = UIColor.lightGrayColor().CGColor
                    label.font = UIFont(name: "Futura-Medium", size: 9)
                    label.textAlignment = NSTextAlignment.Center
                    label.numberOfLines = 1
                    label.text = array[i]
                    label.layer.masksToBounds = true
                    label.layer.cornerRadius = 3.5
                    if let myCell = collectionView.cellForItemAtIndexPath(indexPath) as? CollectionViewCell 
                        myCell.contentView.addSubview(label)
                    
                

             else 

                for i in 0...3 

                    let taille = CGFloat(i)
                    var si = CGFloat((1+i)*3 + 94 + 30)
                    let label = UILabel() as UILabel
                    label.frame = CGRectMake((si + width*taille), cellheight, width, 12)
                    label.textColor = UIColor(red: 0/255, green: 125/255, blue: 255/255, alpha: 1.0)
                    label.backgroundColor = UIColor.clearColor()
                    label.layer.borderWidth = 0.7
                    label.layer.borderColor = UIColor.lightGrayColor().CGColor
                    label.font = UIFont(name: "Futura-Medium", size: 9)
                    label.textAlignment = NSTextAlignment.Center
                    label.numberOfLines = 1
                    label.text = array[i]
                    label.layer.masksToBounds = true
                    label.layer.cornerRadius = 3.5
                    if let myCell = collectionView.cellForItemAtIndexPath(indexPath) as? CollectionViewCell 
                        myCell.contentView.addSubview(label)
                    
                

                var j = 0 as Int
                for i in 4..<array.count 

                    let taille = CGFloat(j)
                    let si = CGFloat((1+j)*3 + 94 + 30)
                    let label = UILabel() as UILabel
                    label.frame = CGRectMake((si + width*taille), cellheight1, width, 12)
                    label.textColor = UIColor(red: 0/255, green: 125/255, blue: 255/255, alpha: 1.0)
                    label.backgroundColor = UIColor.clearColor()
                    label.layer.borderWidth = 0.7
                    label.layer.borderColor = UIColor.lightGrayColor().CGColor
                    label.font = UIFont(name: "Futura-Medium", size: 9)
                    label.textAlignment = NSTextAlignment.Center
                    label.numberOfLines = 1
                    label.text = array[i]
                    label.layer.masksToBounds = true
                    label.layer.cornerRadius = 3.5
                    if let myCell = collectionView.cellForItemAtIndexPath(indexPath) as? CollectionViewCell 
                        myCell.contentView.addSubview(label)
                    
                    j = j + 1
                

            

            return cell
        

     

编辑

我尝试以编程方式创建 UILabel。但通过这种方式,我使用了用 StoryBoard 设计的元素和以编程方式创建的元素。实际上我不能因为这个:

     collectionView!.registerClass(RDCell.self, forCellWithReuseIdentifier: "Cell")

我以编程方式创建了单元格的所有内容(collectionView 是使用情节提要创建的)并且效果很好。

【问题讨论】:

因为单元格被重复使用,加载单元格时添加标签到标签删除带有特定标签的标签,您可以使用viewwithtag方法。 【参考方案1】:

单元格被重复使用,因此每次调用cellForItemAtIndexPath 时,您总是添加新标签。只需像label.tag = 1 这样标记您的标签,当您将单元格出列时,使用此标签删除每个子视图,例如

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionCell", forIndexPath: indexPath) as! CollectionViewCell
for view in cell.subviews 
   if view.tag == 1 
      view.removeFromSuperview()
   

不过,您将始终重新创建标签,这是糟糕的设计。我建议在情节提要上设计这些标签,或者如果您坚持在代码中这样做,请保留对单元格中标签的可选引用,以免每次调用 cellForItemAtIndexPath 时都重新创建它们。

【讨论】:

感谢@FruitAddict,我试过了,但是当我移动一点单元格时,它会删除所有标签。我想以编程方式而不是使用 UIStackView,因为我的目标是 ios8。我在我的 CollectionCell 中创建了 8 个 UILabel (var label : UILabel?...),然后我为它们分配了一个文本值和一个读取到 array.count 的位置。但是什么都没有显示..你知道发生了什么吗?谢谢!【参考方案2】:

不推荐,但你可以做的是, 为每个标签添加标签,如 1000 或其他内容,如果任何子视图标签与标签标签匹配,则查找单元格的子视图删除该视图

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 

     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionCell", forIndexPath: indexPath) as! CollectionViewCell

     for let labelIs in cell.subviews
        
            if labelIs.tag == 1000
            
                labelIs.removeFromSuperview()
            
        
      //some whare 
      var label = UILabel()
      label.tag = 1000
      return cell

【讨论】:

谢谢@NSLog,我试过了,但是当我移动一点单元格时,它会删除所有标签。我在我的 CollectionCell 中创建了 8 个 UILabel (var label : UILabel?...),然后我为它们分配了一个文本值和一个读取到 array.count 的位置。但是什么都没有显示..你知道发生了什么吗?谢谢! 标签永远不会出现?,这样它应该可以工作。 什么都没有出现..我根本不明白..我在编辑中添加了我的脚本。你看出哪里错了吗? 您正在使用自定义单元格,因此您不应该从单元格中删除标签,如果您有这种影响,您可以隐藏和取消隐藏标签。 先去掉labelIs.removeFromSuperview()这段代码试试

以上是关于以编程方式将 UILabel 添加到集合单元,快速的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将 UILabel 和 UiImageView 添加到表视图单元格内的 UIView?

以编程方式并排添加不同宽度的 UILabel

以编程方式将 UILabel 添加到自定义 tableViewCell

以编程方式将按钮添加到集合视图单元格

以编程方式将 UIImage 添加到集合视图单元中

使用子视图重用单元格(以编程方式)