0

我试图从 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 代码原来在这个新的之前打开了另一个 modal。在我打开新模式之前,旧模式没有关闭......所以我更快地关闭旧模式,然后我显示新模式,一切都很好
4

1 回答 1

0

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

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

于 2021-11-30T14:22:18.610 回答