TipKit:如何将 Tip 与 SwiftUI 或 UIKit 集成?

Bra*_*kle 1 swift xcode15 ios17 tipkit

现在TipKit已经由Apple发布并且应该可以在Xcode 15 beta 5上运行,我不知道如何将aTip与视图集成?

我有以下代码:

import SwiftUI

struct TipKitTestView: View {
    var body: some View {
        VStack {
            Text("Some filler text")
            UselessTip()
        }
    }
}

struct UselessTip: Tip {
    var title: Text {
        Text("Useless title")
    }
    
    var message: Text {
        Text("Some useless message that is a bit longer than the title.")
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器不喜欢我有UselessTip()inside TipKitTestView,给出错误:Static method 'buildExpression' requires that 'UselessTip' conform to 'View'。我怎样才能编译代码?我不知道如何使提示成为视图,如果这有意义的话。

顺便说一句,什么代码可以使提示在 UIKit 中工作?我正在尝试结合使用 SwiftUI 和 UIKit 代码向我的项目添加提示,因此我不知道如何将提示集成到主要包含 UIKit 代码的项目中。有谁知道这是怎么做到的吗?

Ben*_*son 5

虽然 TipKit 主要是用 SwiftUI 编写的,但 Apple 提供了 UIKit 和 AppKit 实现。

要在 UIKit 中实现提示,您可以执行以下操作:

struct SearchTip: Tip {
    var title: Text {
        Text("Add a new game")
    }
    
    var message: Text? {
        Text("Search for new games to play via IGDB.")
    }
    
    var asset: Image? {
        Image(systemName: "magnifyingglass")
    }
}

class ExampleViewController: UIViewController {
    var searchButton: UIButton
    var searchTip = SearchTip()

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        Task { @MainActor in
            for await shouldDisplay in searchTip.shouldDisplayUpdates {
                if shouldDisplay {
                    let controller = TipUIPopoverViewController(searchTip, sourceItem: searchButton)
                    present(controller)
                } else if presentedViewController is TipUIPopoverViewController {
                    dismiss(animated: true)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Apple 通过TipUIViewTipUIPopoverViewController和提供了有关 UIKit 实现的更多文档TipUICollectionViewCell。我还写了一篇文章,介绍如何将TipKit 与 SwiftUI 或 UIKit 集成