我在特定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
UICollectionView
中显示单个部分
更新1:在调试时,似乎控件永远不会进入if-case总是返回1。
更新2:if条件是问题所在。它永远不会令人满意。
更新3:我通过将UICollectionViews
声明为类变量而不是属性来获得if-else工作。 UICollectionViews
虽然。
- (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的程度,因为当前的设置还没有完全正常工作
答案 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;
}
或在故事板中设置标签位于下方,
然后你会检查条件是
-(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解决了我的问题。感谢大家的帮助。我正要为此疯狂。