【问题标题】:Navigate from SwiftUI List to UIKit storyboard?从 SwiftUI 列表导航到 UIKit 故事板?
【发布时间】:2021-12-04 01:12:29
【问题描述】:

我在玩 SwiftUI。目前,我有一个带有故事板的应用程序,SwiftUI 视图很少,但有结束视图。

现在我正在努力从 SwiftUI 导航到 UIKit 视图。

        NavigationView {
            List {
                Section(header: Text("App Settings")) {
                    ForEach(AppSettings.allCases) { item in
                        NavigationLink(destination: item.navigator) {
                            SettingsRow(title: item.title, description: item.description, imageName: item.imageName)
                        }
                    }.listRowBackground(Color.grayscaleGray3.swiftUIValue)
                }
                Section(header: Text("Reminders")) {
                    ForEach(SettingsReminders.allCases) { item in
                        SettingsRow(title: item.title, description: item.description, imageName: item.imageName)
                    }.listRowBackground(Color.grayscaleGray3.swiftUIValue)
                }
                Section(header: Text("About us")) {
                    ForEach(AboutUs.allCases) { item in
                        SettingsRow(title: item.title, description: item.description, imageName: item.imageName)
                    }.listRowBackground(Color.grayscaleGray3.swiftUIValue)
                }
                .listStyle(GroupedListStyle())
                
            }
        }

问题在于 NavigationLink(destination: item.navigator)... 如何导航到这样的 UIKit 视图?还是有其他方法可以做到这一点?设置将有 3-4 个部分,一个部分有 4-6 行。有什么帮助吗?

【问题讨论】:

  • 你签出developer.apple.com/tutorials/swiftui/interfacing-with-uikit了吗?您可以将 UIKit UIViews 和 UIViewControllers 包装在可以在 SwiftUI 视图层次结构中显示的可表示对象中
  • @jnpdx 我见过这个。但这是否意味着现在每个 UIKit 视图都需要修改?那是唯一的解决方案吗? ://
  • 没有这样修改,但您需要将它们包装在一个可表示的类中

标签: ios xcode swiftui uikit swiftui-list


【解决方案1】:

您是否将 swiftui 包装在 uikit 视图中?

类似

class ViewController: UIViewController {
    private let hostingController = UIHostingController(rootView: SwiftUIView())

    override func viewDidLoad() {
        addChild(hostingController)
        view.addSubview(hostingController.view)
        NSLayoutConstraints.activate(your constraint code)
    }
}

struct SwiftUIView: View {
    var body: some View {
        NavigationView {
            List {
                Section(header: Text("App Settings")) {
                    ForEach(AppSettings.allCases) { item in
                        NavigationLink(destination: item.navigator) {
                            SettingsRow(title: item.title, description: item.description, imageName: item.imageName)
                        }
                    }.listRowBackground(Color.grayscaleGray3.swiftUIValue)
                }
                Section(header: Text("Reminders")) {
                    ForEach(SettingsReminders.allCases) { item in
                        SettingsRow(title: item.title, description: item.description, imageName: item.imageName)
                    }.listRowBackground(Color.grayscaleGray3.swiftUIValue)
                }
                Section(header: Text("About us")) {
                    ForEach(AboutUs.allCases) { item in
                        SettingsRow(title: item.title, description: item.description, imageName: item.imageName)
                    }.listRowBackground(Color.grayscaleGray3.swiftUIValue)
                }
                .listStyle(GroupedListStyle())
                
            }
        }
}

如果您所拥有的与上面的代码远程相似,那么我认为导航不起作用的原因是您使用的是 NavigationView 而不是 Viewcontroller 类的 UINavigationController。

在这种情况下我要做的是创建一个视图模型,它可以从 swiftui 视图中获取事件并将消息发送到 UIViewController

类似

struct SwiftUIView: View {
     @ObservedObject private let viewModel: MyViewModel

     init(vm: MyViewModel) {
         self.viewModel = vm
     }

     enum PresenterEvent {
        case navigateToAnotherViewController
    }
    /* View Code */
}

在 viewModel 里面你可以有一个函数 像

class MyViewModel {
    func handleSwiftUIViewEvent(_ event: SwiftUIView.PresenterEvent) {
          // try to communicate with the view controller based on the event
         // then have the view controller to navigate to the desired view controller
    }
}

我把所有这些都写在了我的脑海里,所以如果有什么不清楚或者我遗漏了什么,请告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 2013-03-13
    • 2019-11-29
    • 1970-01-01
    • 2017-02-08
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多