我试图在Swift模块的React原生应用程序中展示UIViewController我像这个一样展示它
let screen = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
screen?.rootViewController?.present(payController!, animated: true, completion: nil);
我得到了这个错误:UIApplication.windows must be used from main thread only
好的,我必须把它添加到我的线程中
DispatchQueue.main.async {
let screen = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
screen?.rootViewController?.present(payController!, animated: true, completion: nil);
}
当我用小延迟调用这个函数时,它工作得很好
setTimeout(() => {
showMyWiew();
}, 500);
或者像这种一样延迟到swift
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
let screen = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
screen?.rootViewController?.present(payController!, animated: true, completion: nil);
}
但是如果我去掉延迟,那么这个模态就没有显示出来。但它应该在那里。我在swift的日志中看到了这一点,这证实了我的理论:
[Presentation] Attempt to present <PKAddPaymentPassViewController: 0x103d6b2e0> on <UIViewController: 0x103c25480> (from <UIViewController: 0x103c25480>) which is already presenting <RCTModalHostViewController: 0x10e21df40>.
PKAddPaymentPassViewController
是我的UIViewController
我不知道如何解决这个问题。。。
更新
根据第一条评论,我做了这个
DispatchQueue.main.async {
let screen = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
let controller = screen?.rootViewController?.presentedViewController;
if controller == nil {
screen?.rootViewController?.present(payController!, animated: true, completion: nil);
} else {
screen?.rootViewController?.presentedViewController?.present(payController!, animated: true, completion: nil)
}
}
好消息是模态会出现,但马上就接近了,我看到了打开的效果,然后是关闭的效果。。。
解决方案
- 更新部分中的所有内容
- 重构RN代码事实证明,在这个新模式之前还有另一个开放的模式。在我打开新的模态之前,旧的模态没有关闭。。。所以我更快地关闭旧模式,然后显示新模式,一切都很好
这是因为在那个确切的时刻,screen?.rootViewController
似乎已经呈现了另一个ViewController(RCTModalHostViewController
(。已经呈现某些VC的VC不能呈现另一个VC。您可以做的是在rootViewController此时呈现的VC上调用present:screen?.rootViewController.presentedViewController?.present(...)
。(在呈现的ViewController上呈现确实有效。在呈现另一个VC的VC上呈现则无效。(
如果您这样做,您还应该确保presentedViewController
是实际设置的,而不是nil
。如果是零,你可以像之前一样在rootViewController
上调用present。