Multiple CollectionView inside the UITableView Cell ( Autoscroll ) issue

匿名 (未验证) 提交于 2019-12-03 01:41:02

问题:

I have Multiple CollectionView Inside the TableView and want to implement autoscrolling individually according to data count in each CollectionView

This code is working fine for single CollectionView

My UITableViewCell code is Here

class PromotionalOfferCell: UITableViewCell,UICollectionViewDelegate,UICollectionViewDataSource{      @IBOutlet weak var collVwPromotionalOffer: UICollectionView!      var x = 1     var scroll_timer : Timer?      var data_obj = [PromotionalOfferData]() {         didSet {             print(data_obj)         }     }      override func awakeFromNib() {         super.awakeFromNib()         if collVwPromotionalOffer != nil{             self.collVwPromotionalOffer.dataSource = self             self.collVwPromotionalOffer.delegate = self         }     }      func setTimer() {         scroll_timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.autoScroll), userInfo: nil, repeats: true)     }      @objc func autoScroll() {         if self.x < self.data_obj.count {             let indexPath = IndexPath(item: x, section: 0)             self.collVwPromotionalOffer.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)             self.x = self.x + 1          } else {             self.x = 0             self.collVwPromotionalOffer.scrollToItem(at: IndexPath(item: 0, section: 0), at: .centeredHorizontally, animated: true)         }     }  }  // CollectionView Delegate & DataSource  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {         if data_obj.count > 0{             return data_obj.count         }         return 0     }  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as? ImageCell      cell?.imgView.sd_setImage(with:URL(string: data_obj[indexPath.row].image!), placeholderImage: UIImage(named: "cod_logo"), options: [.highPriority]) { (image, error, cashtype, url) in }      return cell! } 

UITableView Delegate

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {      if tableViewItems.count > 0{         return self.tableViewItems.count     }     return 0  }  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {          if let Promotional_Item = tableViewItems[indexPath.row] as? [PromotionalOfferData]{              let cell = tableView.dequeueReusableCell(withIdentifier: "PromotionalOfferCell", for: indexPath) as! PromotionalOfferCell              cell.data_obj = Promotional_Item             cell.collVwPromotionalOffer.reloadData()              if cell.scroll_timer != nil {                 cell.scroll_timer!.invalidate()                 cell.scroll_timer = nil             }              if Promotional_Item.count > 1{                 cell.setTimer()             }             return cell         }     } 

My Output is Like this

The issue is that I print in Log and realize that the timer is called more than one time for each CollectionView

Due to this the memory size of Application is Continues increase and I already invalidate the timer

Can someone tell me where I am Wrong? Thanks in advance

回答1:

Hi Nikunj instead of making to many timers , make one timer and handle actions like scrolling in its selector instead for different cells cause for every table view cell timer interval is same ,also you can try do this on willdisplay and invalidate in willEndDisplaying!(though I don't like this to many timers). Hope it helped!



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!