SWCollaborationView 作为标准 UI 元素引入,用于管理 iOS16+ 中用户之间的实时协作。 Apple 文章 对此进行了解释。类似于UICloudSharingController,它是查看参与者共享和管理共享的方式。
鉴于 UICloudSharingController 在 iOS16+ 中损坏(参见this),我如何在 SwiftUI 中使用 SWCollaborationView?
到目前为止我失败的尝试:
WWDC22 演讲介绍了 SWCollaborationView,演讲者在 UIBarButtonItem(customView:) 中嵌入了 SWCollaborationView。我无法将 UIBarButtonItem(customView:) 嵌入到我的 SwiftUI 生命周期应用程序中,因为 UIBarButtonItem 不符合 UIView,因此无法使用 UIViewRepresentable 引入。
我也试过把SWCollaborationView包裹在UIViewRepresentable里面,直接引入。结果与this post相同。当我将它包裹在 ToolbarItem 中时,图标出现了,但点击时没有发生任何动作。当我将它包装在 ToolbarItem 和 Button 中时,会打开与弹出窗口相同的协作视图,图标出现 (screenshot1) 并且点击打开弹出窗口,其中会出现相同的图标 (screenshot2。只有第二次点击会正确打开 SWCollaborationView 固有的所需弹出窗口(screenshot3)。代码如下。
import SwiftUI
import CloudKit
import SharedWithYou
struct DetailView: View {
var photo: Photo // some object saved in CloudKit, in this example a photo
@State var showPopover = false
@Binding var activeCover: ActiveCover? // for dismissal (not relevant for SWCollaborationView)
var body: some View {
NavigationView {
VStack {
Text("Some content of detail view")
}
.toolbar {
if let existingShare = PersistenceController.shared.existingShare(photo: photo) { // get the existing CKShare for this object (in this case we use NSPersistentCloudKitContainer.fetchShares, but that's not really relevant)
ToolbarItem(placement: .automatic) {
Button(action: {
showPopover.toggle()
}){
CollaborationView(existingShare: existingShare) // <- icon appears, but without the number of participants
}
.popover(isPresented: $showPopover) {
CollaborationView(existingShare: existingShare) // <- icon appears AGAIN, with the number of participants. Instead, we want a popover inherent to SWCollabroationView!
}
}
}
ToolbarItem(placement: .automatic) {
Button("Dismiss") { activeCover = nil }
}
}
}
}
}
struct CollaborationView: UIViewRepresentable {
let existingShare: CKShare
func makeUIView(context: Context) -> SWCollaborationView {
let itemProvider = NSItemProvider()
itemProvider.registerCKShare(existingShare,
container: PersistenceController.shared.cloudKitContainer,
allowedSharingOptions: .standard)
let collaborationView = SWCollaborationView(itemProvider: itemProvider)
collaborationView.activeParticipantCount = existingShare.participants.count
return collaborationView
}
func updateUIView(_ uiView: SWCollaborationView, context: Context) {
}
}
在 SwiftUi 中它被称为ShareLink
我就此提交了 TSI; Apple 确认 SWCollaborationView 目前与 SwiftUI 不兼容,我们应该提交反馈。
我不知道怎么做,但是把一些 .frame 放到 CollaborationView 上让它可以点击。
CollaborationView(existingShare: existingShare).frame(width: 40, height: 40)