单元格动画停止分数必须大于开始分数

Posted

技术标签:

【中文标题】单元格动画停止分数必须大于开始分数【英文标题】:Cell animation stop fraction must be greater than start fraction 【发布时间】:2012-07-26 07:53:10 【问题描述】:

我在表格视图单元格中使用动画...当单元格完全可见时,动画工作正常。如果当时由于动画任何单元格部分可见,我的应用程序在 [_Mytableviewobject endUpdates] 行处崩溃;

崩溃日志=由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“单元格动画停止部分必须大于开始部分”

代码部分:

-(void)sectionHeaderView:(SectionHeaderView*)sectionHeaderView sectionOpened:(NSInteger)sectionOpened

     //ENSLog(self, _cmd);
    [_caseTable reloadData];
    NSInteger countOfRowsToInsert = 1;
    SectionInfo *sectionInfo = [self.sectionInfoArray objectAtIndex:sectionOpened];
    sectionInfo.open = YES;


    NSMutableArray *indexPathsToInsert = [[[NSMutableArray alloc] init] autorelease];
    for (NSInteger i = 0; i < countOfRowsToInsert; i++) 
    
        [indexPathsToInsert addObject:[NSIndexPath indexPathForRow:i inSection:sectionOpened]];
    

    NSMutableArray *indexPathsToDelete = [[[NSMutableArray alloc] init] autorelease];
    NSInteger previousOpenSectionIndex = self.openSectionIndex;
    if (previousOpenSectionIndex != NSNotFound)
    
        SectionInfo *previousOpenSection = [self.sectionInfoArray objectAtIndex:previousOpenSectionIndex];
        previousOpenSection.open = NO;
        [previousOpenSection.headerView toggleOpenWithUserAction:NO];
        NSInteger countOfRowsToDelete = 1;
        for (NSInteger i = 0; i < countOfRowsToDelete; i++)
        
            [indexPathsToDelete addObject:[NSIndexPath indexPathForRow:i inSection:previousOpenSectionIndex]];
        
    

    // Style the animation so that there's a smooth flow in either direction.
    UITableViewRowAnimation insertAnimation;
    UITableViewRowAnimation deleteAnimation;
    if (previousOpenSectionIndex == NSNotFound || sectionOpened < previousOpenSectionIndex) 
    
        insertAnimation = UITableViewRowAnimationTop;
        deleteAnimation = UITableViewRowAnimationBottom;
    
    else
    
        insertAnimation = UITableViewRowAnimationTop;
        deleteAnimation = UITableViewRowAnimationTop;
    

    // Apply the updates.
    [_caseTable beginUpdates];
    [_caseTable deleteRowsAtIndexPaths:indexPathsToDelete withRowAnimation:deleteAnimation];
    [_caseTable insertRowsAtIndexPaths:indexPathsToInsert withRowAnimation:insertAnimation];
    [_caseTable endUpdates];
    //ExNSLog(self, _cmd);

    self.openSectionIndex = sectionOpened;
    //ExNSLog(self, _cmd);






-(void)sectionHeaderView:(SectionHeaderView*)sectionHeaderView sectionClosed:(NSInteger)sectionClosed

     //ENSLog(self, _cmd);
    SectionInfo *sectionInfo = [self.sectionInfoArray objectAtIndex:sectionClosed];
    sectionInfo.open = NO;
    NSInteger countOfRowsToDelete = [_caseTable numberOfRowsInSection:sectionClosed];
    if (countOfRowsToDelete > 0)
    
        NSMutableArray *indexPathsToDelete = [[[NSMutableArray alloc] init] autorelease];
        for (NSInteger i = 0; i < countOfRowsToDelete; i++) 
        
            [indexPathsToDelete addObject:[NSIndexPath indexPathForRow:i inSection:sectionClosed]];
        
        [_caseTable deleteRowsAtIndexPaths:indexPathsToDelete withRowAnimation:UITableViewRowAnimationTop];
    
    self.openSectionIndex = NSNotFound;
     //ExNSLog(self, _cmd);

【问题讨论】:

【参考方案1】:

我在尝试使用虚拟页脚删除潜在的“空”表格视图单元格时遇到了同样的崩溃。

解决办法是摆脱

tableView:viewForFooterInSection:
tableView:heightForFooterInSection:

并在 viewDidLoad 中将它们替换为以下内容:

tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

【讨论】:

这是完美的解决方案!完美运行,并允许完全隐藏空单元格。非常感谢! 感谢您的解决方案;) 如果您需要一个固定在屏幕底部的页脚视图怎么办?您不能为此使用 tableFooterView :( 我需要一个粘性页脚和可调整大小的单元格,但我一直遇到这个崩溃! 如果你真的需要节页脚(所以每个节都有一个页脚)怎么办?表格视图页脚不能替代它。【参考方案2】:

是的,我也面临这种类型的问题,只需删除页脚视图即可。

【讨论】:

这并不能解释为什么。我在滚动时遇到了同样的异常(不删除或添加行,仅在滚动时),它是一个 PITA。 建议的解决方案对我也不起作用。如果有人可以解释为什么此解决方案适用于某些人可能会有所帮助【参考方案3】:

设置tableview时似乎会发生

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

tableview 样式设置Plain 而不是Grouped 样式

【讨论】:

【参考方案4】:

ios 7 更新后我遇到了同样的问题:在我的表格视图中展开/折叠内容的“deleteRowsAtIndexPaths”期间出现了崩溃。

令人惊讶的是,我已经通过使用 heightForHeaderInsection 而不是 heightForFooterInSection 解决了这个问题。

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 返回 1; // 修复前为 0 -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section 返回0; // 在修复之前是 1

已报告此问题 (https://devforums.apple.com/message/795349)。

【讨论】:

能否发我一些表格视图展开和折叠的演示代码 这对我有用。不知道为什么。看起来只是一个 iOS 7 错误。 这应该在列表中较高的位置。这确实是一个操作系统错误,并且该错误仅与节页脚(而不是标题)有关。所以对于我们这些必须有节分隔符的人来说,解决方案是使用页眉而不是页脚。也许不理想,但比这里提出的其他选项更好(使用 tableView 页脚,摆脱部分页脚等)。【参考方案5】:

您可以使用下一节的标题 我的答案在这里

创建空白部分 使用页眉代替页脚

https://***.com/a/12297703/788798

【讨论】:

【参考方案6】:

对于在 iOS 7 更新后遇到此问题的用户: 检查剖面页脚视图的视图框架。如果它与 tableview 单元格重叠。系统抛出此异常。

【讨论】:

我认为它是 iOS 7.0、7.0.1、7.0.2 的真正错误。它似乎已在 iOS 7.0.3 上修复。 不,这在 7.0.3 之后仍然存在。至少在 7.1、7.1.1 和 7.1.2 中【参考方案7】:

这是 iOS 中的一个错误。我提交了一个错误报告,他们回来说它是 14898413 的副本。这个错误在苹果错误报告器中仍然标记为打开。

修复选项: 1)删除页脚 2)不是删除行,而是开始和结束更新重新加载表

【讨论】:

【参考方案8】:

每当我滚动到表格视图底部并尝试删除单元格并插入部分时,我都会遇到相同的错误和崩溃,我的解决方案是在使用表格视图内容偏移量调用[tableview beginsUpdates] 之前将表格视图滚动回顶部.有了这个解决方案,我根本不需要更改我的部分页眉或页脚。

[self.tableView setContentOffset:CGPointZero animated:NO];

【讨论】:

也为我工作。不幸的是,此修复仅在 tableview 的内容大小大于其边界时才有效。【参考方案9】:

我通过在最后一节调用 reloadData() 解决了这个错误:

func expandSectionPressed(sender: UIButton) 
    let object = items[sender.tag]
    object.expanded = !object.expanded
    sender.selected = object.expanded
    var indexPaths = [NSIndexPath]()
    for i in 0..<7 
        indexPaths.append(NSIndexPath(forRow: i, inSection: sender.tag))
    
    if object.expanded 
        tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Fade)
     else 
        // strange crash when deleting rows from the last section //
        if sender.tag < numberOfSectionsInTableView(tableView) - 1 
            tableView.deleteRowsAtIndexPaths(indexPaths, withRowAnimation: .Fade)
         else 
            tableView.reloadData()
        
    

【讨论】:

【参考方案10】:

我遇到了同样的问题 - [[self tableView] endUpdates] 中的异常“单元格动画停止分数必须大于开始分数”;我通过捕获异常并第二次进行 endUpdates 来解决它。

[[self tableView] beginUpdates];
@try

    [[self tableView] endUpdates];

@catch (NSException* exception)

    [[self tableView] endUpdates];

【讨论】:

这确实避免了崩溃,但它导致我的布局不正确。它似乎折叠了我的页脚。

以上是关于单元格动画停止分数必须大于开始分数的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionView 单元格中停止动画

谷歌表格 - 基于单元格引用调用行

单元格消失时动画停止,再次出现时动画停止

删除高度大于其他单元格的单元格时,动画看起来很尴尬

怎么在excel中输入15-01

Excel根据分数,填充相应的五角星,俗称五角星打分;