菜鸟教程小白 发表于 2022-12-13 00:31:53

IOS UICollectionView 在使用两个 Collection View 时抛出断言


                                            <p><p>我在一个 UIViewController 中有两个 UICollectionView。我用标签号分隔它们,以便我可以同时使用数据源和委托(delegate)方法。但是,当我运行代码时,它会因异常而崩溃:</p>

<p><code>由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UICollectionView 接收到具有不存在索引路径的单元格的布局属性:<NSIndexPath:0xc000000000200016> {length = 2, path = 0 - 1 }'</code>.</p>

<p>我在论坛中查找了这个,大多数人说你需要使 UIControllerView 无效然后重新加载,但在我的情况下这不起作用。 </p>

<p>有人知道如何解决这个问题吗?</p>

<p>这是我的代码:</p>

<pre><code>-(void)viewDidLoad {

    self.socialMediaGrayIcons = [ initWithObjects:,
                            ,
                            ,
                            ,
                            , nil];

    // setup collection view
    self.avatarCollectionView.tag = 200;
    self.socialMediaCollectionView.tag = 201;

    UINib *cellNib = ;
    ;
    ;

    // setup collection view layout
    UICollectionViewFlowLayout *flowLayout = [ init];
    ;
    ;

    ;
    ;

    ;
    ;

    ;
    ;
}

....

#pragma mark UICollectionView DataSource and Delegate mathods
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    if (collectionView.tag == 200)
    {
      return self.children.count;
    } else if (collectionView.tag == 201){
      return self.socialMediaGrayIcons.count;
    }

    return 1;
}


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell;

    if (collectionView.tag == 200)
    {
      static NSString *cellIdentifier = @&#34;cvCell&#34;;
      cell = ;

      Child *currentChild = ;


      UIImage *curImage = ;
      UIImageView *thumbView = (UIImageView *);

      if (curImage != nil)
      {
            ;

      }
    } else if (collectionView.tag == 201){

      static NSString *cellIdentifier = @&#34;smCell&#34;;
      cell = ;

      UIImage *curImage = (UIImage*) ;
      UIImageView *thumbView = (UIImageView *);

      if (curImage != nil)
      {
            ;

      }
    }

    return cell;
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>采纳@Paulw 的好建议如下所示:</p>

<pre><code>@property(weak,nonatomic) IBOutlet UICollectionView *collectionViewA;
@property(weak,nonatomic) IBOutlet UICollectionView *collectionViewB;
</code></pre>

<p>您的数据源方法必须严格按照传递的 Collection View 将条件划分为两个分支,并且始终在一个中使用一个数据源数组,在另一个中使用另一个。 </p>

<p>您可以通过始终通过方便的方法获取数据源来强制执行此宗教,例如...</p>

<pre><code>- (NSArray *)datasourceForCollectionView:(UICollectionView *)collectionView {
    if (collectionView == self.collectionViewA) {
      return self.children;
    } else { // NOTICE - no else-if, there&#39;s no other valid condition
      return self.socialMediaGrayIcons;
    }
}
</code></pre>

<p>在任何地方都可以使用它,例如...</p>

<pre><code>- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return .count;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于IOS UICollectionView 在使用两个 Collection View 时抛出断言,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/43195498/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/43195498/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: IOS UICollectionView 在使用两个 Collection View 时抛出断言