【发布时间】:2017-11-27 21:01:08
【问题描述】:
我有一个UITableViewCell,其中包含一个带有自动布局的TWTRTweetView。我正在加载这样的推文:
- (void)loadTweetWithId:(NSString *)tweetId {
if (mTweetId == nil || ![mTweetId isEqualToString:tweetId]) {
mTweetId = tweetId;
[[[TWTRAPIClient alloc] init] loadTweetWithID:tweetId completion:^(TWTRTweet *tweet, NSError *error) {
if (tweet) {
NSLog(@"Tweet loaded!");
[mTweetView configureWithTweet:tweet];
[mTweetView setShowActionButtons:YES];
//[mTweetView setDelegate:self];
[mTweetView setPresenterViewController:self.viewController];
[mTweetView setNeedsLayout];
[mTweetView layoutIfNeeded];
[mTweetView layoutSubviews];
hc.constant = mTweetView.frame.size.height;
[self updateConstraints];
[self layoutIfNeeded];
[self layoutSubviews];
[self.tableView setNeedsLayout];
[self.tableView layoutIfNeeded];
[self.tableView layoutSubviews];
} else {
NSLog(@"Tweet load error: %@", [error localizedDescription]);
}
}];
}
}
当推文加载单元格不会调整大小时,除非我将其滚动并向后滚动。正如您在代码 sn-p 中看到的那样,我尝试了几种方法。但这些都不是。我的表格视图使用全自动布局方法,它没有为行函数实现单元格高度。我该如何解决这个问题?
更新:
使用:
[self.tableView beginUpdates];
[self.tableView endUpdates];
是不可能的,因为当我这样做时,所有单元格都被重绘并且发生了非常大的跳跃,这是不可接受的。此外,我已经确认推文完成块在主线程中运行。
更新 2:
我还尝试使用推文 ID 缓存推文视图,并为相关索引路径重新加载单元格,并为推文 ID 提供相同的推文视图。单元格高度已更正,但在向外/向内滚动之前它不会变得可见。
更新 3:
我在单元格的 xib 中为推文视图提供了约束,并且高度约束已连接。所以这不是主线程问题。我还提到在索引处重新加载特定单元格不起作用。
在使用其他解决方案时,我看到了一些使用 TWTRTweetTableViewCell 的示例 TwitterKit 代码,但正在预加载推文以配置单元格。所以我也做了同样的事情。这当然是一种解决方法。
【问题讨论】:
-
当使用自动调整大小的表格视图时,我有时会很幸运地一个接一个地调用
[self.tableView beginUpdates];和[self.tableView endUpdates];- 你试过了吗? -
这看起来像是一大堆额外的/不需要的“布局”东西——你是不是添加了越来越多的东西?无论如何,从您发布的代码中很难判断,但我猜您的
completion块正在后台线程上运行。所有 UI 更新都必须在主线程上完成。搜索objective c uitableview update on main thread以获取示例。 -
迟到了,抱歉。是否检查了 mTweetView.frame.size.height 在完成回调中是否有更新的值?
-
推文加载完成后,在
heightForRowAtIndexPath定义单元格高度后调用tableView的reloadData函数。 -
@ayazmon reloadData 不是一个选项。
标签: ios uitableview twitter twitterkit