2017-11-18 179 views
0

我有一個tableview有兩個單元格和兩個嵌入式collectionviews在這些單元格內。當它試圖讓第二個單元格變形時,我的應用程序不斷崩潰。我使用了Ash Furrows教程作爲這個項目的基礎,我將在這裏鏈接。 Tutorial link如何爲集合視圖創建多個數據源?

我該如何解決這個問題?這裏是一些示例代碼。

我有兩個不同的細胞,它們各自有這個代碼

class TableViewCell: UITableViewCell { 

    @IBOutlet weak var collectionView: UICollectionView! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

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

     // Configure the view for the selected state 
    } 

    func setCollectionViewDataSourceDelegate <D: UICollectionViewDataSource & UICollectionViewDelegate> (dataSourceDelegate: D, forRow row: Int) { 
     collectionView.delegate = dataSourceDelegate 
     collectionView.dataSource = dataSourceDelegate 
     collectionView.tag = row 
     collectionView.reloadData() 
    } 
} 

這自己的階級是代碼的其餘部分展示我如何出隊我的手機

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     if indexPath.section == 1 { 
      guard let tableViewCell = cell as? TableViewCell else { 
       return 
      } 

      tableViewCell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 
     } 

     if indexPath.section == 2 { 
      guard let tableViewCell2 = cell as? TableViewCell2 else { 
       return 
      } 
      tableViewCell2.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 
     } 


     // we store the offset from here into the dictionary we created above 
     //tableViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0 
    } 

    func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     guard let tableViewCell = cell as? TableViewCell else { return } 

     storedOffsets[indexPath.row] = tableViewCell.collectionViewOffset 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     print(indexPath) 
    } 
} 

// collectionView inside tableview cell 

extension TabViewController1: UICollectionViewDelegate, UICollectionViewDataSource { 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return model[collectionView.tag].count 
    } 

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


     if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as? CollectionCell1 { 
      cell.backgroundColor = UIColor.gray 
      return cell 
     } 

     if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell2", for: indexPath) as? CollectionCell2 { 
      cell.backgroundColor = UIColor.purple 
      return cell 
     } 

     return UICollectionViewCell() 
    } 

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     print("Collection view at row \(collectionView.tag) selected index path \(indexPath)") 
    } 
} 

任何幫助將非常感謝!

編輯:這是整個視圖控制器類

class TabViewController1: UIViewController, UITableViewDelegate { 

    @IBOutlet private var tableView: UITableView! 

    var model: [[UIColor]] = [] 

    // Here we create a new dictionary to store the offests, corresponding to their rows. 
    var storedOffsets = [Int: CGFloat]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     print("tab1") 

     model = generateRandomData() 
     tableView.delegate = self 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     print("tab 1 viewWillAppear") 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func generateRandomData() -> [[UIColor]] { 
     let numberOfRows = 20 
     let numberOfItemsPerRow = 15 

     return (0..<numberOfRows).map { _ in 
      return (0..<numberOfItemsPerRow).map { _ in UIColor.randomColor() } 
     } 
    } 
} 

extension TabViewController1: UITableViewDataSource { 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 5 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if section == 3 { 
      return 1 
     } 
     if section == 4 { 
      return 6 
     } else { 
      return 1 
     } 
    } 

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

     if indexPath.section == 0 { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "featuredPicture", for: indexPath) as! FeaturedVideoTableViewCell 
      return cell 
     } 

     if indexPath.section == 1 { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell 
      return cell 
     } 


     if indexPath.section == 2 { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath) as! TableViewCell2 
      return cell 
     } 

     if indexPath.section == 3 { 

      let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath) as! HeaderTableViewCell 
      return cell 
     } 

     if indexPath.section == 4 { 

      let cell = tableView.dequeueReusableCell(withIdentifier: "categoryCell", for: indexPath) as! CategoryTableViewCell 
      return cell 
     } 

     return UITableViewCell() 

    } 

    // titleForHeaderInSection doesnt get called because I implemented the bottom method which is `viewForHeaderInSection`. 
    // I am trying to figure out if we can use both at the same time 
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 

     if section == 0 { 
      return "Featured" 
     } 

     if section == 1 { 
      return "Cool Stuff" 
     } 

     if section == 2 { 
      return "Awesome Stuff" 
     } 

     if section == 3 { 
      return "nothing" 
     } 

     if section == 4 { 
      return "Categories" 
     } 

     return String() 
    } 

    // viewForHeaderInSection 
// func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
//  if section == 3 { 
//   let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell") as! HeaderTableViewCell 
//   return cell 
//  } 
//  return UIView() 
// } 

// func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
//  if section == 3 { 
//   return 50 
//  } 
//  return CGFloat() 
// } 

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     if indexPath.section == 1 { 
      guard let tableViewCell = cell as? TableViewCell else { 
       return 
      } 

      tableViewCell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 
     } 

     if indexPath.section == 2 { 
      guard let tableViewCell2 = cell as? TableViewCell2 else { 
       return 
      } 
      tableViewCell2.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 
     } 


     // we store the offset from here into the dictionary we created above 
     //tableViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0 
    } 

    func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     guard let tableViewCell = cell as? TableViewCell else { return } 

     storedOffsets[indexPath.row] = tableViewCell.collectionViewOffset 
    } 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if indexPath.section == 0 { 
      return 350 
     } 

     if indexPath.section == 1 { 
      return 130 
     } 

     if indexPath.section == 2 { 
      return 200 
     } 

     if indexPath.section == 3 { 
      return 50 
     } 

     if indexPath.section == 4 { 
      return 220 
     } 

     return CGFloat() 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     print(indexPath) 
    } 
} 

// collectionView inside tableview cell 

extension TabViewController1: UICollectionViewDelegate, UICollectionViewDataSource { 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return model[collectionView.tag].count 
    } 

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

     if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as? CollectionCell1 { 
      cell.backgroundColor = UIColor.gray 
      return cell 
     } 

     if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell2", for: indexPath) as? CollectionCell2 { 
      cell.backgroundColor = UIColor.purple 
      return cell 
     } 

     return UICollectionViewCell() 
    } 


    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     print("Collection view at row \(collectionView.tag) selected index path \(indexPath)") 
    } 
} 
+0

你有沒有分段tableview? – ivarun

+0

@ivarun此刻我有部分。我在EDIT中添加了全班,供您參考。感謝您的幫助 – user7097242

回答

0

沒有看到你在哪裏註冊你的課程,很難肯定地說,但我懷疑的是,你要回來以外的東西比你的-cellForRow ...或者-cellForItemAt ...方法中的TableViewCell2(或者實際上崩潰的地方)要多。你所有的力量解包(!)都可能導致問題。在崩潰前放置一個斷點,然後檢查您實際從-dequeueReusableCell調用中返回的內容。

+0

我添加了上面編輯的整個班級?你還想看什麼?我可以寄給你這個虛擬項目來看看嗎? – user7097242

+0

你還在這裏? – user7097242

相關問題