Ios UITableView没有';在显示ViewDid之前,不要渲染

Ios UITableView没有';在显示ViewDid之前,不要渲染,ios,swift,uitableview,Ios,Swift,Uitableview,我正在使用设置转换到UITableViewController的动画,它不知何故导致我的UITableView在调用viewdidebeen()之前不渲染任何单元格 我已经确定UITableView确实在调用viewdideappease()之前很久就完成了加载(使用日志记录和时间戳),并且使用打印语句来确定调用viewdideappease()时,UITableView正好出现。其他一些堆栈溢出帖子建议将tableView.reloadData()放在主线程上,我已经这样做了(没有用) 导入U

我正在使用设置转换到
UITableViewController
的动画,它不知何故导致我的
UITableView
在调用
viewdidebeen()
之前不渲染任何单元格

我已经确定UITableView确实在调用
viewdideappease()
之前很久就完成了加载(使用日志记录和时间戳),并且使用打印语句来确定调用
viewdideappease()
时,
UITableView
正好出现。其他一些堆栈溢出帖子建议将
tableView.reloadData()
放在主线程上,我已经这样做了(没有用)

导入UIKit
导入操作系统日志
进口英雄
类成员TableViewController:UITableViewController、UIGestureRecognitizerDelegate{
//马克:财产
变量成员:[成员]?
//拖动以退出
var panGestureRecognizer:UIPanGestureRecognizer!
变量progressBool:Bool=false
var dismissBool:Bool=false
//标记:覆盖
重写func viewDidLoad(){
super.viewDidLoad()
//寄存器单元
tableView.register(UINib(nibName:“MemberTableViewCell”,bundle:bundle.main),强制重用标识符:“MemberCell”)
//配置英雄
view.hero.isEnabled=true
view.hero.isEnabledForSubviews=false
view.hero.id=“成员”
view.hero.modifiers=[.arc(),.useLayerRenderSnapshot]
//获取成员
API.shared.getMembers{中的成员
self.members=成员
DispatchQueue.main.async{
self.tableView.reloadSections(IndexSet(arrayLiteral:0),带:.fade)
}
}
//安装程序拖动以退出
panGestureRecognizer=UIPanGestureRecognizer(目标:自我,操作:#选择器(退出))
pangestruerecognizer.delegate=self
view.AddgestureRecognitor(PangestureRecognitor)
}
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
//自定义导航栏
self.navigationController?.navigationBar.shadowImage=UIImage()
self.navigationController?.navigationBar.backgroundColor=self.tableView.backgroundColor
self.navigationController?.setNavigationBarHidden(错误,动画:动画)
}
覆盖函数视图显示(u动画:Bool){
super.viewdide显示(动画)
打印(“出现”)
}
重写变量preferredStatusBarStyle:UIStatusBarStyle{
return.lightContent
}
覆盖变量preferShomeIndicator自动隐藏:Bool{
返回真值
}
//标记:-表视图数据源
重写func numberOfSections(在tableView:UITableView中)->Int{
返回1
}
重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回成员?计数?0
}
重写func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
guard let cell=tableView.dequeueReusableCell(标识符为:“MemberCell”,for:indexPath)作为?MemberTableViewCell else{
fatalError(“出列单元格不是MemberTableViewCell的实例”)
}
//配置单元格。。。
cell.load(来自:members![indexPath.row])
返回单元
}
//标记:私有方法
@objc专用函数出口(识别器:UIPangestureRecognitor){
let translation=识别器。translation(in:nil)
让progressY=(translation.y/2)/view.bounds.height
如果recognizer.direction==.down&&tableView.isAtTop{
如果解雇布尔{
dismissBool=false
hero.dismissViewController()
self.hero.modalAnimationType=.uncover(方向:。向下)
progressBool=true
recognizer.setTranslation(.0,在:视图中)
}
}
开关识别器.state{
案例。更改:
如果是布尔{
让currentPos=CGPoint(x:view.center.x,y:translation.y+view.center.y)
Hero.shared.update(progressY)
Hero.shared.apply(修饰符:[.position(currentPos)],to:view)
}
违约:
dismissBool=true
progressBool=false
如果abs(progressY+识别器速度(in:nil).y/视图边界高度)>0.5{
Hero.shared.finish()
}否则{
Hero.shared.cancel()
}
}
}
//马克:UIgestureRecognitzerDelegate
func gestureRecognizer(uGestureRecognizer:UIGestureRecognizer,应与其他gestureRecognizer:UIGestureRecognizer同时识别)->Bool{
返回真值
}
//MARK:UIScrollViewDelegate
重写func scrollViewDidScroll(scrollView:UIScrollView){
如果scrollView.isAtTop&&scrollView.PangestureRecognitizer.direction==.down{
scrollView.contentOffset=CGPoint(x:0,y:-(UIApplication.shared.keyWindow?.safeAreaInsets.top±0)
)
}
}
}
我希望
UITableView
在动画结束时立即显示,并播放
tableView.reloadSections()
动画,但似乎动画发生在
UITableView
实际出现之前,因此它只是在稍微延迟后闪烁进入视图(看起来很糟糕,请参见下文)


注意:禁用Hero后,
tableView.reloadSections()
动画将毫不延迟地播放。

我尚未使用您提到的框架,但您可以尝试在视图完成渲染之前延迟重新加载tableView:

DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    self.tableView.reloadSections(IndexSet(arrayLiteral: 0), with: .fade)
}
三秒钟是很长的时间。我喜欢称之为“穴居人”调试。三秒是一个奇怪的时间量,所以如果它起作用,试着减少延迟因子

另一个想法是在主队列上设置成员,例如
DispatchQueue.main.async {
    self.members = members
    self.tableView.reloadSections(IndexSet(arrayLiteral: 0), with: .fade)
}
var tableViewLoaded: Bool = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    guard isViewLoaded, view.window != nil, !tableViewLoaded else { return }
    tableView.reloadSections(IndexSet(arrayLiteral: 0), with: .fade)
    tableViewLoaded = true // flip it to true so you don't constantly reload
}