呈现视图控制器时出现奇怪的错误
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()
}
}
我知道代码有点断章取意,但我相信意图很明确。
我有一个以 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()
}
}
我知道代码有点断章取意,但我相信意图很明确。