You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI中通过NavigationLink跳转至UIKit的ViewController?

解决SwiftUI中NavigationLink跳转至UIKit ViewController的问题

错误原因

你遇到的报错核心原因是:SwiftUI的NavigationLink目标必须遵循View协议,而UIKit的ViewController属于UIKit框架组件,并不符合SwiftUI的View类型要求,因此无法直接放入NavigationLink中使用。

高效解决方法:用UIViewControllerRepresentable桥接

通过创建一个遵循UIViewControllerRepresentable协议的结构体,把UIKit的ViewController包装成Swift可识别的View类型,就能正常在NavigationLink中使用了。

1. 创建包装结构体

import SwiftUI
import UIKit

struct ViewControllerWrapper: UIViewControllerRepresentable {
    // 初始化并返回你的ViewController实例
    func makeUIViewController(context: Context) -> ViewController {
        ViewController()
    }
    
    // 若需要更新ViewController的内容,在这里实现逻辑(无需求可留空)
    func updateUIViewController(_ uiViewController: ViewController, context: Context) {}
}

2. 在NavigationLink中使用包装器

NavigationLink {
    ViewControllerWrapper()
} label: {
    Text("XXX")
}

扩展:传递参数给ViewController

如果需要给ViewController传递初始化数据或参数,可以在包装结构体中添加属性,再同步到内部的ViewController:

struct ViewControllerWrapper: UIViewControllerRepresentable {
    // 定义需要传递的参数
    let targetID: String
    
    func makeUIViewController(context: Context) -> ViewController {
        let vc = ViewController()
        // 将参数赋值给ViewController的对应属性
        vc.targetID = targetID
        return vc
    }
    
    func updateUIViewController(_ uiViewController: ViewController, context: Context) {
        // 当参数变化时,同步更新ViewController的属性
        uiViewController.targetID = targetID
    }
}

// 使用示例
NavigationLink {
    ViewControllerWrapper(targetID: "user_123")
} label: {
    Text("跳转至UIKit页面")
}

内容的提问来源于stack exchange,提问作者aisha's SO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:45:33