单个 UIViewController 中的多个集合视图未调用 cellForItemAtIndexPath indexPath

Posted

技术标签:

【中文标题】单个 UIViewController 中的多个集合视图未调用 cellForItemAtIndexPath indexPath【英文标题】:cellForItemAtIndexPath indexPath not called for multiple collection views in a single UIViewController 【发布时间】:2016-03-31 14:31:38 【问题描述】:

我试图在单个视图控制器中拥有多个集合视图。我试图通过为每个集合视图使用单独的标签来实现这一点,但在我看来,celForItemAtIndexPath 没有被调用。以下是我的UIViewController 代码。

import UIKit
class HomeViewController: UIViewController 
  // MARK: - IBOutlets

  @IBOutlet weak var backgroundImageView: UIImageView!
  @IBOutlet weak var collectionView: UICollectionView!
  @IBOutlet weak var friendsCollectionView: UICollectionView!

  // MARK: - UICollectionViewDataSource
  private var interests = Interest.createInterests()
  private var friends = Friends.createFriends()

  override func preferredStatusBarStyle() -> UIStatusBarStyle 
    return .LightContent
  

  override func viewDidLoad() 
    super.viewDidLoad()
    self.collectionView.tag = 100;
    self.friendsCollectionView.tag = 200;
    collectionView.registerClass(NSClassFromString("InterestCell"),forCellWithReuseIdentifier:"cell");
    friendsCollectionView.registerClass(NSClassFromString("FriendCell"),forCellWithReuseIdentifier:"cellB");

    self.view.addSubview(collectionView)
    self.view.addSubview(friendsCollectionView)
    print("view did load")
  

  private struct Storyboard 
    static let CellIdentifier = "InterestCell"
    static let FriendIdentifier = "FriendCell"
  
 

extension HomeViewController : UICollectionViewDataSource 
  func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
    print("number of sections are 1")
    return 1
  

  func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    print("trying this")
    if collectionView.tag == 100 
      let cell = collectionView.dequeueReusableCellWithReuseIdentifier(Storyboard.CellIdentifier, forIndexPath: indexPath) as! InterestCollectionViewCell

      print("inside pluto")
      return cell
    
    else 
      let cellB = friendsCollectionView.dequeueReusableCellWithReuseIdentifier(Storyboard.FriendIdentifier, forIndexPath: indexPath) as! FriendListCollectionViewCell
      print("inside venus")
      return cellB
    
  

  func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    print("hello")
    if collectionView == collectionView 
      print(interests.count)
      return interests.count
    
    else 
      print("hmmm")
      return friends.count 
    
  

有人可以建议我做错了什么吗?

【问题讨论】:

您是否为两者正确设置了数据源和 collectionView 委托? 【参考方案1】:

要到达 cellForItemAtIndexPath 方法,您必须像这样设置 collectionView 数据源:

collectionView.dataSource = self;
friendsCollectionView.dataSource = self;

另外,最好不要使用标签来识别每个集合,使用类似于:

if (collectionView == self.collectionView)   else if (collectionView
== self.friendsCollectionView)  // init friend cell ... 

【讨论】:

【参考方案2】:

您应该指定集合的​​委托和数据源。

collectionView.delegate = self
collectionView.dataSource = self

记得将 UICollectionViewDelegateUICollectionViewDataSource 添加到您的 ViewController。

【讨论】:

【参考方案3】:

    您是否正确设置了数据源和委托?由于该课程不符合UICollectionViewDataSourceUICollectionViewDelegate,我猜不。在viewDidLoad 中执行此操作:

    collectionView.delegate = self collectionView.dataSource = 自我 FriendsCollectionView.delegate = self FriendsCollectionView.dataSource = 自我

或者通过xib来做。

    通过编辑类声明使类符合UICollectionViewDataSourceUICollectionViewDelegate

    HomeViewController 类:UIViewController、UICollectionViewDelegate、UICollectionViewDataSource

    我建议您使用对对象的引用而不是标签。通过检查代表的 collectionView 对象是否等于您实例化的对象来引用集合视图:

    如果 collectionView == self.friendsCollectionView //做点什么 if collectionView == self.collectionView //做点什么

【讨论】:

以上是关于单个 UIViewController 中的多个集合视图未调用 cellForItemAtIndexPath indexPath的主要内容,如果未能解决你的问题,请参考以下文章

具有单个 uiviewcontroller 和多个视图的自动布局 iOS

是否可以跨多个 UIViewController 使用单个 UIView?

iOS 程序在单个 UIViewController 中使用多个 UITableView

如何使用单个故事板uiviewcontroller为多个子类

将 BigQuery 中的多个 Firebase 数据集聚合为单个数据集

数据访问设计:多个结果集单个存储过程或每个存储过程单个结果集