菜鸟教程小白 发表于 2022-12-13 02:49:55

ios - 修复了 UICollectionView 中的静态单元格


                                            <p><p> <img src="https://puu.sh/cnc93/70bd9c423f.png" alt="https://puu.sh/cnc93/70bd9c423f.png"/> </p>

<p>在我的 iPad 应用程序中,我使用了 UICollectionView,它显示用户通过 NSFetchedResultsController 在核心数据中保存的不同注释。
根据设计,我必须显示一个带有控件的单元格才能在核心数据中添加新注释。添加注释后,它将显示为 Collection View 中的第二个单元格。</p>

<p>我尝试通过以下方式实现它;</p>

<pre><code>#pragma mark - UICollectionViewDataSource

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView
{
    return self.fetchedResultsController.sections.count?:1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:   (NSInteger)section
{
    id&lt;NSFetchedResultsSectionInfo&gt; sectionInfo = [ objectAtIndex:section];

    return ?:1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0 &amp;&amp; indexPath.item == 0)
{
    AddNewNoteCell *cell = ;
    cell.delegate = self;
    return cell;
    }
    else
    {
      NoteCell *cell = ;
      //Code for customization
    return cell;
   }
}
</code></pre>

<p>但是这种方法会引起问题。它不会立即添加新创建的注释单元格。如果添加,则新添加的单元格显示为“添加新单元格”。如果我弹出 ViewController 并再次加载 ViewController ,它会正确显示单元格。</p>

<p>请指导我以获得准确的解决方案。
这可能吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>假设您希望“添加新注释”单元格显示为第一部分中的第一项,但不在任何其他部分中,您需要修改 <code>numberOfItemsInSection</code> 方法以将 1 添加到<code></code> 用于第 0 部分。对于其他部分,您应该只返回 <code>numberOfObjects</code>:</p>

<pre><code>- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:   (NSInteger)section
{
    id&lt;NSFetchedResultsSectionInfo&gt; sectionInfo = [ objectAtIndex:section];
    NSInteger items = ;
    if (section == 0) items++;
    return items;
}
</code></pre>

<p>然后在 <code>cellForItemAtIndexPath:</code> 中,您可以(如您所见)将第 0 节中的项目 0 视为您的特殊情况(即,给它一个不同的单元子类并相应地配置它)。对于其他单元格,您可以使用 <code>indexPath</code> 对其进行配置,以从 <code>fetchedResultsController</code> 获取详细信息。但是,在第 0 节中,您需要对此进行调整:单元格 0 是您的“添加新注释”单元格,因此您希望使用 <code>fetchedResultsController</code> 中的项目 0 的详细信息来配置单元格 1。构造一个新的 indexPath:</p>

<pre><code>NSIndexPath *fetchIndexPath = ;
</code></pre>

<p>并使用它从您的 fetchedResultsController 中获取正确的数据。</p>

<p>我假设您的“添加新注释”单元格调用 ViewController 中的某些方法将新注释对象添加到您的 <code>managedObjectContext</code>。如果你实现了 <code>NSFetchedResultsController</code> 委托(delegate)方法(见 <a href="http://developer.apple.com/library/IOs/documentation/CoreData/Reference/NSFetchedResultsControllerDelegate_Protocol/index.html" rel="noreferrer noopener nofollow">docs</a> ),你可以立即用新添加的对象更新你的collectionView。但是你必须把上面对第 0 节的调整反过来:</p>

<pre><code>- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    ;
}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id &lt;NSFetchedResultsSectionInfo&gt;)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    switch(type) {
      case NSFetchedResultsChangeInsert:
            ];
            break;

      case NSFetchedResultsChangeDelete:
            ];
            break;
    }
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
    NSIndexPath *adjustedIndexPath;
    NSIndexPath *adjustedNewIndexPath;
    if (indexPath.section == 0) {
      adjustedIndexPath = ;
      adjustedNewIndexPath = ;
      indexPath = adjustedIndexPath;
      newIndexPath = adjustedNewIndexPath;
    }
    switch(type) {
      case NSFetchedResultsChangeInsert:
            ];
            break;
      case NSFetchedResultsChangeDelete:
            ];
            break;
      case NSFetchedResultsChangeUpdate:
             atIndexPath:indexPath];
            break;
      case NSFetchedResultsChangeMove:
            ;
            break;
    }
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    ;
}
</code></pre>

<p>您应该定制上述方法以满足您的特定需求(例如,我假设您不希望允许将部分移动到第 0 部分之前)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 修复了 UICollectionView 中的静态单元格,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26525744/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26525744/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 修复了 UICollectionView 中的静态单元格