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

如何在Xcode的Swift5 Storyboard项目中添加可用Widget

问题描述

我在Swift5的Storyboard项目中添加Widget的操作如图:
How I'm Adding Widget

添加后自动生成的是基于SwiftUI的Widget组件,无法在我的项目中正常使用,该组件的显示情况如图:
SwiftUI Widget Display

需要可行的解决方案。


解决方案

方法1:用UIKit视图包装适配SwiftUI Widget

如果你的项目里已经有现成的UIKit/Storyboard视图,直接通过UIViewRepresentable把它转换成SwiftUI兼容的组件,替换自动生成的SwiftUI代码即可:

  1. 创建包装结构体,加载你的UIKit视图:
import SwiftUI
import WidgetKit

struct UIKitWidgetWrapper: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        // 替换成你的Storyboard名称和视图控制器ID
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: Self.self))
        guard let targetView = storyboard.instantiateViewController(withIdentifier: "WidgetVC").view else {
            return UIView()
        }
        return targetView
    }

    func updateUIView(_ uiView: UIView, context: Context) {
        // 这里可以处理Widget数据更新逻辑,比如刷新视图内容
    }
}
  1. 修改Widget的入口视图,替换为包装后的组件:
struct MyWidgetEntryView: View {
    var entry: Provider.Entry

    var body: some View {
        UIKitWidgetWrapper()
            .widgetURL(URL(string: "yourapp://widget-action")) // 可选:添加App跳转链接
    }
}

方法2:排查Widget扩展配置问题

如果是配置错误导致SwiftUI Widget无法正常运行,检查以下几点:

  • 确认Widget扩展的部署目标和主项目一致(WidgetKit最低要求iOS 14+)
  • 检查扩展的Info.plist:NSExtensionPrincipalClass要对应你的IntentHandler类(默认是$(PRODUCT_MODULE_NAME).IntentHandler,不要随意修改)
  • 如果需要共享主项目的数据,开启App Groups,在主项目和Widget扩展中配置相同的Group ID,用UserDefaults(suiteName:)或共享容器传递数据

方法3:完全基于UIKit构建Widget(本质还是包装)

WidgetKit本身是围绕SwiftUI设计的,没有纯UIKit的原生Widget方案,但你可以把整个Widget的内容都用UIKit实现,再通过UIViewControllerRepresentable包装成SwiftUI视图,核心逻辑和方法1一致,适合需要完全复用现有UIKit业务代码的场景。


内容的提问来源于stack exchange,提问作者Er. Hiren Shiyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:12:49