滚动时避免在UITableView单元格中重复数据

时间:2017-02-02 12:03:03

标签: ios swift uitableview xcode8

我需要在viewcontroller顶部自动滚动图像滑块,然后是一些实体列表(带图像和标题的动态单元格)。为了实现我已经采用了uitableview,我将scrollview添加到我的第一个单元格,我的代码如下

public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if indexPath.row  == 0{
       return 200
    }
    else {
       return 50
    }    
}

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 20    
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell  = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    if indexPath.row  == 0 {

       let sv = UIScrollView(frame: CGRect(x: 0, y: 0, width: cell.frame.width, height: cell.frame.height))

       sv.auk.show(url: "url for image1")
       sv.auk.show(url: "url for image2")

       cell.addSubview(sv)
       print("inside if")
      }
      else {

       print("else")
       cell.textLabel?.text = "cool"
      }
      return cell                
}

我正在使用this存储库创建图像滑块,在滚动视图上创建滑块,因此对于第一个单元格,我添加了scrollview。但正如您在图片中看到的那样,图像滑块重新出现在多行上。请告诉我我正在做的错误。如果有更好的方法,请建议。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试为动态单元格单独创建一个类。将 cellForRow 方法中的单元格(静态和动态单元格)排队,如下所示:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return indexPath.row == 0 ? 200 : 50
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 20 }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if indexPath.row  == 0 {

        let cell  = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        scrollViewWidth = cell.frame.width
        scrollViewHeight = cell.frame.height
        let scrollView = prepareScrollView(width: scrollViewWidth, height: scrollViewHeight)
        cell.addSubview(scrollView )

        print("First row")
        return cell
       }
       else {

        let myCustomCell: MyCustomTableViewCellClass = tableView.dequeueReusableCell(withIdentifier: "MyCustomTableViewCellIdentieier", for: indexPath) as! MyCustomTableViewCellClass 
        myCustomCell.textLabel?.text = "Cool"

        print("Other dynamic rows")
        return myCustomCell
      }
}

func prepareScrollView(_ width: Float, height: Float) -> UIScrollView {

    let scrollViewFrame = CGRect(x: 0, y: 0, width: width, height: height)
    let scrollView = UIScrollView(frame: scrollViewFrame)
    scrollView.auk.show(url: "url for image1")
    scrollView.auk.show(url: "url for image2") 

    return scrollView
}

将一个单独的类作为 UITableViewCell 类型的 MyCustomTableViewCellClass ,并使用此类为您的动态单元格创建子类。不要忘记将单元格标识符设为“MyCustomTableViewCellIdentieier”

在此之后,您的静态单元格将只出列一次,并且没有机会重复UI元素

答案 1 :(得分:0)

您可以在表格视图单元格类中尝试此代码 -

 override func prepareForReuse() {
    //set your lable and image view to nil
}

SideMenuTVCell是我的自定义UITableViewCell类 -

希望您在此课程中拥有自己的课程,并添加prepareForReuse()方法 -

class SideMenuTVCell: UITableViewCell {

@IBOutlet weak var iconIView: UIImageView!
@IBOutlet weak var lblTitle: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

}

override func setHighlighted(_ highlighted: Bool, animated: Bool) {
    super.setHighlighted(highlighted, animated: animated)  

}

override func prepareForReuse() {
    //set your lable and image view to nil

   self.iconIView.image = nil
   self.lblTitle.text = nil

 }

}