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 在插入/滚动时未更新的主要内容,如果未能解决你的问题,请参考以下文章