集合视图中的节数

时间:2016-06-01 05:19:21

标签: ios objective-c uicollectionview

我在特定UICollectionViews中有两个UIViewController,我希望在这两个中有不同数量的部分。我一直在尝试以下方式

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
if (collectionView == self.firstcollectionView) {
    return objects.count + 1;
   }
else
   {
    return 1;
   }
}

但它似乎并不是出于某种原因。

还尝试使用标签,但也无法使其正常工作。

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
if (collectionView.tag == 1) {
    return objects.count + 1;
   }
else
   {
    return 1;
   }
}

当我能够检查到有1个对象应该意味着第一个UICollectionViews

中有2个部分时,它始终在UICollectionView中显示单个部分

更新1:在调试时,似乎控件永远不会进入if-case总是返回1。

更新2:if条件是问题所在。它永远不会令人满意。

更新3:我通过将UICollectionViews声明为类变量而不是属性来获得if-else工作。 UICollectionViews虽然。

,但部分的数量仍为1
- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
if (collectionView == cardscollectionView) {
    return 2;
   }
else
   {
    return 1;
   }
}

仍然无法正常工作。虽然这个

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
    return 2;
}

工作得很好。只是为了说明布局很好,2个单元格确实出现在两个集合视图中。

样本项目(需求巨大:D) -

https://github.com/genaks/UIICollectionView-Sections

我还没有达到重新加载UICollectionView的程度,因为当前的设置还没有完全正常工作

7 个答案:

答案 0 :(得分:4)

确保您已为两个集合视图(例如

)设置委托和数据源
   self.firstcollectionView.delegate = self;
   self.firstcollectionView.datasource = self;

第二次收集也是如此。

确保您已正确连接插座。

确保正确设置标记

<强>更新

 - (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {

if (collectionView == self.cardscollectionView) {

    NSLog(@"getting called. It is cardcollerctionView");
    return 2;

}
if (collectionView == self.bankscollectionView) {
    NSLog(@"getting called. it is bankcollectionView");
    return 1;
}

else
{
    return 1;


}

    //use above or below both are working fine.
    //******************************* OR ********************************************

    if (collectionView == self.cardscollectionView) {

        NSLog(@"getting called. It is cardcollerctionView");
        return 2;

    }
    else
    {
        NSLog(@"it is else");
        return 1;


    }

 }

我已经运行了你的演示,它运行正常。我已使用numberofsection方法更新了答案。这两部分代码都在工作。确保您没有对UICollectionViewLayout

使用相同的collectionViews

希望这会有所帮助:)

答案 1 :(得分:0)

我认为你不会正确设置标签,首先在viewDidLoad:方法中设置标签,示例如下,

- (void)viewDidLoad {
    [super viewDidLoad];
     // put your code...
    firstCollectionView.tag = 10000;
    secondCollectioView.tag = 9000;
} 

或在故事板中设置标签位于下方,

enter image description here

然后你会检查条件是

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    if (collectionView.tag == 9000) {
        return 1;
    } else {
        return objects.count + 1;;
    }

}

希望它有用

答案 2 :(得分:0)

这肯定会奏效。试试吧。

 -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView
 {
      if([collectionView isEqual:self.firstcollectionView]){
          //return object count for firstCollectionView;
      }
      else if([collectionView isEqual:self.secondCollectionView])
      {
          //return object count for secondCollectionView;
      } 
 }

答案 3 :(得分:0)

检查没有标记的UICollectionView标识的初始方法确实有效,并且比使用标记更强大,但如果对象计数为0,那么节计数仍然相同。您提到在从Web加载元素后,计数最初为0然后为1。在Web加载完成后,您是否在collectionViews上调用reloadData()

这是一个完整的工作示例,在代码中创建了两个UICollectionView(没有任何Web提取),可以使用不同的节数:

class CustomCell: UICollectionViewCell {}

class DoubleViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

var firstCollectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let v = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
    v.translatesAutoresizingMaskIntoConstraints = false
    v.registerClass(CustomCell.self, forCellWithReuseIdentifier: "CustomCell")
    return v
}()

var secondCollectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let v = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
    v.translatesAutoresizingMaskIntoConstraints = false
    v.registerClass(CustomCell.self, forCellWithReuseIdentifier: "CustomCell")
    return v
}()

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.addSubview(self.firstCollectionView)
    self.view.addSubview(self.secondCollectionView)
    self.firstCollectionView.delegate = self
    self.secondCollectionView.delegate = self
    self.firstCollectionView.dataSource = self
    self.secondCollectionView.dataSource = self
}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    if collectionView == self.firstCollectionView {
        return 1
    }
    return 2
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CustomCell", forIndexPath: indexPath) as! CustomCell
    cell.backgroundColor = randomColor()
    return cell
}

override func updateViewConstraints() {
    super.updateViewConstraints()
    self.firstCollectionView.leadingAnchor.constraintEqualToAnchor(self.view.leadingAnchor).active = true
    self.firstCollectionView.trailingAnchor.constraintEqualToAnchor(self.view.trailingAnchor).active = true
    self.firstCollectionView.bottomAnchor.constraintEqualToAnchor(self.secondCollectionView.topAnchor).active = true
    self.firstCollectionView.topAnchor.constraintEqualToAnchor(self.topLayoutGuide.bottomAnchor).active = true
    self.secondCollectionView.bottomAnchor.constraintEqualToAnchor(self.bottomLayoutGuide.topAnchor).active = true
    self.secondCollectionView.leadingAnchor.constraintEqualToAnchor(self.view.leadingAnchor).active = true
    self.secondCollectionView.trailingAnchor.constraintEqualToAnchor(self.view.trailingAnchor).active = true
    self.firstCollectionView.heightAnchor.constraintEqualToAnchor(self.secondCollectionView.heightAnchor).active = true
  }
}

因为你没有使用xibs / storyboards

,所以需要额外的约束代码

答案 4 :(得分:0)

试试这个:

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView
{
  if([collectionView isEqual: collectionView1])
  {
    return CollectionArray1.count;
  }
  else if ([collectionView isEqual: collectionView2])
  {
    return CollectionArray2.count;
  }
  else
  {
    NSLog(@"Dummy Text");
  }
  return 1;
}

答案 5 :(得分:0)

也许,您的cardscollectionView在执行numberOfSectionsInCollectionView之前已经更改,或者您以错误的方式设置了委托。

添加以下代码以检查两个collectionViews的委托是否为self

正确的日志是 两个不同的 collectionView地址, 只有一个 {{1} } 地址。

cardscollectionView

答案 6 :(得分:0)

问题是我对UICollectionViews使用了相同的UICollectionViewLayout。使用2个不同的UICollectionViewLayouts解决了我的问题。感谢大家的帮助。我正要为此疯狂。