UITableView 在插入/滚动时未更新

Posted

技术标签:

【中文标题】UITableView 在插入/滚动时未更新【英文标题】:UITableView Not Updating On Insert/Scroll 【发布时间】:2014-10-08 13:57:24 【问题描述】:

我有一个 UITableViewController,在控制器中我有以下代码:

// Update the table view
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:([self.transcripts count] - 1) inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

// Scroll to the bottom so we focus on the latest transcript
NSUInteger numberOfRows = [self.tableView numberOfRowsInSection:0];
if (numberOfRows) 
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(numberOfRows - 1) inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];

我遇到的问题是 UITableView 永远不会更新。我已经验证我的成绩单数组的大小正在增加,并且 cellForRowAtIndexPath: 被调用。我难住了。我错过了什么?

编辑:如果有帮助,这是我的 IB tableView 定义。

<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" allowsSelection="NO" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="MXJ-GP-L47">
    <rect key="frame" x="0.0" y="0.0"  />
    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
    <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
    <color key="separatorColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
    <color key="sectionIndexTrackingBackgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
    <prototypes>
        <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="MessageCell" id="sdU-aF-ZZy">
            <autoresizingMask key="autoresizingMask"/>
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="sdU-aF-ZZy" id="7IE-xs-uAL">
                <autoresizingMask key="autoresizingMask"/>
            </tableViewCellContentView>
            <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
        </tableViewCell>
        <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="ImageCell" id="Lac-k8-MMs">
            <autoresizingMask key="autoresizingMask"/>
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Lac-k8-MMs" id="IVD-DR-azV">
                <autoresizingMask key="autoresizingMask"/>
            </tableViewCellContentView>
            <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
        </tableViewCell>
        <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="ProgressCell" id="efc-wO-XPu">
            <autoresizingMask key="autoresizingMask"/>
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="efc-wO-XPu" id="7j1-RG-rHz">
                <autoresizingMask key="autoresizingMask"/>
            </tableViewCellContentView>
            <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
        </tableViewCell>
    </prototypes>
    <connections>
        <outlet property="dataSource" destination="Eyi-tC-JyD" id="AM2-Xx-Xsd"/>
        <outlet property="delegate" destination="Eyi-tC-JyD" id="Tkb-ac-NHB"/>
    </connections>
</tableView>

【问题讨论】:

【参考方案1】:

在插入之前你必须调用

- (void)beginUpdates;   // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable

插入完成后调用

- (void)endUpdates;     // only call insert/delete/reload calls or change the editing state inside an update block.  otherwise things like row count, etc. may be invalid.

【讨论】:

我试过了。这并没有什么不同。之后手动滚动时,我什至看不到行。 尝试删除一个动画或者插入动画或者滚动动画,这两个动画可能会干扰。但是您必须在 tableview 上调用开始/结束更新。 相同的结果,有和没有 beginUpdates/endUpdates。如果有帮助,我将我的 IB tableView 定义添加到问题中。【参考方案2】:

我想通了。基本上,我为每个单元格使用自定义视图,但我没有在单元格的内容视图中标记或嵌入自定义视图。

【讨论】:

以上是关于UITableView 在插入/滚动时未更新的主要内容,如果未能解决你的问题,请参考以下文章

iPhone通过滑出表格视图来滚动UITableview

UITableView 在插入时滚动

UITableView 在滚动时在顶部插入部分

iOS UITableView在过滤时滚动插入

在 UITableView 中插入最后一行并平滑滚动

在 UITableView 中插入一些行后,它在 ios 7 中没有滚动