1

我发现了一个显示错误的最小 SwiftUI 应用程序:

class HelloWorldVC: UIViewController {
    override func loadView() {
        super.loadView()
        let label = UILabel()
        label.text = "Hello, World"
        view.addSubview(label)

        label.translatesAutoresizingMaskIntoConstraints = false
        label.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        label.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        label.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    }
}

struct ViewControllerContainer: UIViewControllerRepresentable {
    let vc: UIViewController

    func makeUIViewController(context: Context) -> some UIViewController { vc }
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}
}

struct ContentView: View {
    var body: some View {
        NavigationView {

            // Works:
            //NavigationLink("View UIKit VC", destination: ViewControllerContainer(vc: HelloWorldVC()))

            // Only loads the UIKit view once. It's blank on subsequent tries.
            NavigationLink(
                "Detail Screen",
                destination: NavigationLink(
                    "View UIKit VC",
                    destination: ViewControllerContainer(vc: HelloWorldVC())
                )
            )
        }
    }
}

重现步骤:

  • 点击“详细画面”
  • 点击“查看 UIKit VC”。您将看到“Hello, World”UIViewController。
  • 点击返回
  • 点击“查看 UIKit VC”

预期

  • 您应该再次看到“Hello, World” UIViewController

实际

  • 您将看到一个空白视图。这将在您尝试时发生多次。

从第二次尝试看到的空白屏幕

注意:在注释掉的代码中,如果您只有一层 NavigationLink 深度,它可以正常工作。

4

1 回答 1

1

您没有UIViewControllerRepresentable正确使用。您需要在内部创建一个新的视图控制器makeUIViewController,在您的情况下重用它会破坏视图控制器的生命周期。

创建或更新视图控制器时,可以将UIViewControllerRepresentable属性传递给视图控制器,如下所示:

struct ViewControllerContainer: UIViewControllerRepresentable {
    let props: Int

    func makeUIViewController(context: Context) -> some UIViewController { 
        HelloWorldVC(props: props) 
    }
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
        uiViewController.props = props
    }
}
于 2021-09-11T08:22:29.687 回答