【问题标题】:UISegmentedControl as UINavigationBar title item loads after some delayUISegmentedControl 作为 UINavigationBar 标题项在延迟后加载
【发布时间】:2016-11-11 00:05:17
【问题描述】:

自从我更新到 Xcode8/iOS10 和 Swift 3 后,我在用作导航栏标题的分段控件上遇到了这个奇怪的问题。它需要一些时间才能出现。或者我可以触摸该区域(当时不可见)它会出现。

我相信该项目已加载但没有被绘制,然后它通过触摸该区域或由于事件循环要求重绘视图而被绘制。

UI 未被阻止。

找不到解决办法。

PS:无法在新项目上重现

与 Debug View Hierarchy 中断,UISegmentedControls 似乎存在,但没有使用颜色/文本初始化。然后它会在几秒钟后。

【问题讨论】:

  • 第二个视图是如何绘制的?您是否在实际设备上对此进行了测试?模拟器(至少对我而言)在尝试在 GPU 上执行任何操作时都会遭受重大的性能损失。也许这是你不应该担心的事情?
  • 问题出现在模拟器和设备上。这个分段控件实际上没有绑定到任何东西

标签: ios swift xcode uinavigationbar uisegmentedcontrol


【解决方案1】:

好的,这是由于线程。

加载时我的应用正在初始化核心数据堆栈。在它的回调中,我使用window.rootViewController = vc 实例化了正确的视图控制器,这需要在主线程上执行,但是核心数据堆栈初始化的完成是在后台启动的。


还有些奇怪。我已经实现了一个 UIWindow 扩展

extension UIWindow {

  func setRootViewController(with viewController: UIViewController) {
    DispatchQueue.main.async {
      self.rootViewController = viewController
    }
  }

}

// beeing in background thread
self.window.setRootViewController(with: self.rootVC)

这将产生以下问题。

但下一个会起作用

extension UIWindow {

  func setRootViewController(with viewController: UIViewController) {
    self.rootViewController = viewController
  }

}

// beeing in background thread
DispatchQueue.main.async {
   self.window.setRootViewController(with: self.rootVC)
}

不知道有什么区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2010-11-04
    • 2018-03-28
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多