如何在SwiftUI中使用SWCollaborationView?

问题描述 投票:0回答:3

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) {
  }
}
ios swift swiftui cloudkit collaboration
3个回答
0
投票

在 SwiftUi 中它被称为ShareLink


0
投票

我就此提交了 TSI; Apple 确认 SWCollaborationView 目前与 SwiftUI 不兼容,我们应该提交反馈。


0
投票

我不知道怎么做,但是把一些 .frame 放到 CollaborationView 上让它可以点击。

CollaborationView(existingShare: existingShare).frame(width: 40, height: 40)
© www.soinside.com 2019 - 2024. All rights reserved.