2017-11-18 13 views
0

두 개의 셀이있는 tableview와이 셀 안에있는 두 개의 embeddedviewview가 있습니다. 내 앱이 두 번째 셀을 큐에 넣으려고 할 때 내 앱이 계속 충돌합니다. 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

단면 테이블 뷰가 있습니까? – ivarun

+0

@ivarun 순간에는 섹션이 있습니다. 내가보기에 편집을 위해 전체 수업을 추가하고 있습니다. 도움을 주셔서 감사합니다 – user7097242

답변

0

, 그것은 확실히 말하기 어렵지만, 내 의심은 다른 뭔가 돌아가고 있다는 것입니다 -cellForRow ... 또는 -cellForItemAt ... 메소드에서 TableViewCell2 (또는 실제로 충돌하는 곳)보다 더 큽니다. 귀하의 모든 힘을 푸는 (!) 문제가 발생할 가능성이 높습니다. 크래시 바로 전에 중단 점을 넣고 -dequeueReusableCell 호출에서 실제로 돌아 오는 것을 확인하십시오.

+0

위의 편집에서 전체 클래스를 추가 했습니까? 그 밖의 무엇을보고 싶니? 좀보고 싶은데이 거짓 프로젝트를 보내 주시겠습니까? – user7097242

+0

아직도 여기 있니? – user7097242