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<NSFetchedResultsSectionInfo> sectionInfo = [ objectAtIndex:section];
return ?:1;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0 && 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<NSFetchedResultsSectionInfo> 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 <NSFetchedResultsSectionInfo>)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]