Modul应该在主线程中显示modal/UIViewController,但它不能毫无延迟地工作



我试图在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)
}
}

好消息是模态会出现,但马上就接近了,我看到了打开的效果,然后是关闭的效果。。。

解决方案

  1. 更新部分中的所有内容
  2. 重构RN代码事实证明,在这个新模式之前还有另一个开放的模式。在我打开新的模态之前,旧的模态没有关闭。。。所以我更快地关闭旧模式,然后显示新模式,一切都很好

这是因为在那个确切的时刻,screen?.rootViewController似乎已经呈现了另一个ViewController(RCTModalHostViewController(。已经呈现某些VC的VC不能呈现另一个VC。您可以做的是在rootViewController此时呈现的VC上调用present:screen?.rootViewController.presentedViewController?.present(...)。(在呈现的ViewController上呈现确实有效。在呈现另一个VC的VC上呈现则无效。(

如果您这样做,您还应该确保presentedViewController是实际设置的,而不是nil。如果是零,你可以像之前一样在rootViewController上调用present。

相关内容

  • 没有找到相关文章

最新更新