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

如何在SwiftUI与UIKit中集成Apple TipKit?

TipKit 集成问题解决方案

一、SwiftUI 中的编译错误解决

你遇到的'Static method 'buildExpression' requires that 'UselessTip' conform to 'View''错误,核心原因是**UselessTip是遵循Tip协议的提示数据模型,本身不是SwiftUI视图**,不能直接放在View的body中。必须用TipKit提供的TipView组件来包裹它,才能渲染成可展示的UI。

正确示例代码

  1. 先定义你的Tip模型:
import TipKit

struct UselessTip: Tip {
    var title: Text {
        Text("这是一个测试提示")
    }
    var message: Text? {
        Text("这里是提示的详细说明内容")
    }
}
  1. 在SwiftUI视图中使用TipView包裹Tip实例:
struct TipKitTestView: View {
    var body: some View {
        // 正确写法:用TipView承载Tip实例
        TipView(UselessTip())
            .padding()
    }
}

二、UIKit为主的混合项目集成方法

1. 全局初始化TipKit

首先要在App启动阶段完成TipKit的配置,确保提示系统正常工作:

import TipKit

// 在AppDelegate中添加
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 配置TipKit,默认使用UserDefaults存储提示状态
    try? Tips.configure()
    return true
}

// 或者在SceneDelegate中(如果使用场景模式)
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    try? Tips.configure()
    guard let _ = (scene as? UIWindowScene) else { return }
}

2. 两种集成场景

场景1:在UIKit中嵌入SwiftUI的TipView

通过UIHostingController把TipView包装成UIKit控制器,再添加到你的UIKit视图层级中:

import UIKit
import SwiftUI
import TipKit

class TestViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        // 创建Tip实例
        let uselessTip = UselessTip()
        // 用UIHostingController包裹TipView
        let tipHostVC = UIHostingController(rootView: TipView(uselessTip))
        // 自动适配大小
        tipHostVC.view.sizeToFit()
        
        // 添加到当前视图
        addChild(tipHostVC)
        view.addSubview(tipHostVC.view)
        tipHostVC.didMove(toParent: self)
        
        // 手动设置提示视图的位置(比如放在某个控件下方)
        tipHostVC.view.frame = CGRect(x: 50, y: 200, width: tipHostVC.view.frame.width, height: tipHostVC.view.frame.height)
    }
}

场景2:直接使用TipKit的UIKit原生API

TipKit提供了针对UIKit的适配API,可以直接绑定到UIKit控件展示提示:

import UIKit
import TipKit

class TestViewController: UIViewController {
    let testButton = UIButton(type: .system)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        // 配置按钮
        testButton.setTitle("点击触发提示", for: .normal)
        testButton.frame = CGRect(x: 100, y: 100, width: 200, height: 50)
        view.addSubview(testButton)
        
        // 创建Tip实例
        let uselessTip = UselessTip()
        // 创建提示展示上下文,绑定到按钮作为触发源
        let presentationContext = TipPresentationContext(tip: uselessTip, sourceItem: testButton)
        
        // 手动触发展示(也可以依赖规则自动触发)
        testButton.addTarget(self, action: #selector(showTip), for: .touchUpInside)
    }
    
    @objc func showTip() {
        let uselessTip = UselessTip()
        let presentationContext = TipPresentationContext(tip: uselessTip, sourceItem: testButton)
        try? presentationContext.present()
    }
}

补充:自定义提示触发规则

你可以在Tip模型中定义规则,控制提示何时显示,比如用户点击按钮N次、进入页面N次等:

struct UselessTip: Tip {
    var title: Text { Text("自定义规则提示") }
    var message: Text? { Text("点击按钮2次后显示此提示") }
    
    // 定义触发规则:按钮点击次数达到2次
    var rules: [Rule] {
        #Rule(testButton.didCount) { $0 == 2 }
    }
}

内容的提问来源于stack exchange,提问作者Braeden Meikle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:35:12