呈现视图控制器时出现奇怪的错误

Weird bug when presenting a view controller

我有一个以 UITabBarController 作为根视图控制器的基本应用程序。当应用程序的用户未登录时,我会在我的 AppDelegate 中通过 window!.rootViewController!.present(viewController, animated: true) 显示模态控制器。这适用于所有 iPhone 模型,但是以下情况会发生在任何 iPad:

SignInController 的背景颜色在转换过程中可见。现在奇怪的事情来了:当我将 Interface Builder 中的视图更改为 iPad 时,错误消失了,如下所示:

将背景颜色改回透明默认值至少会删除白色背景,但是视图仍然从左下角开始动画,这是我不想要的。顺便说一下,在 Interface Builder 中更改视图会破坏所有 iPhone 上的动画。将其改回可以修复它,但会再次破坏所有 iPads.

这是代码(使用 ReSwift 进行状态管理):

func newState(state: State) {
  switch (previousState.session, state.session) {
  case (.loading, .notSignedIn), (.signedIn, .loading):
      (window!.rootViewController! as! UITabBarController).selectedIndex = 0

      let viewController = storyboard.instantiateViewController(withIdentifier: "SignInViewController")
      window!.rootViewController!.present(viewController, animated: true, completion: nil)

  default:
    // more stuff
    break
  }
}

编辑:添加了实际代码。

我修好了!

问题是在 keyboardWillShowNotification 上有一个观察者和在所呈现的控制器的 viewWillAppear 方法中有一个 becomeFirstResponder 的组合。

becomeFirstResponder 移动到 viewDidAppear 解决了所有问题!

谢谢大佬!拯救了我的一天..我从一个表格视图单元格中展示键盘 - 我这样修复它:

private var canPresentKeyboard: Bool = false

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    canPresentKeyboard = true
    if _currentlySelectedIdType != .image {
        reload(section: .idType)
    }
}

func configure(cell: NumberIdTableViewCellInput) {
    cell.set(delegate: self)
    if canPresentKeyboard {
        cell.clearAndSetFirstResponder()
    }
}

我知道代码有点断章取意,但我相信意图很明确。