繁体   English   中英

SwiftUI中如何使用SWCollaborationView?

[英]How to use SWCollaborationView in SwiftUI?

SWCollaborationView是作为标准 UI 元素引入的,用于管理 iOS16+ 中用户之间的实时协作。 这篇Apple 文章对此进行了解释。 类似于UICloudSharingController ,它是查看共享参与者和管理共享的方式。

鉴于 UICloudSharingController 在 iOS16+ 中损坏(请参阅),我如何在 SwiftUI 中使用 SWCollaborationView?

到目前为止我失败的尝试:

WWDC22 talk介绍了SWCollaborationView,演讲者在UIBarButtonItem(customView:)中嵌入了SWCollaborationView。 我无法将 UIBarButtonItem(customView:) 嵌入到我的 SwiftUI 生命周期应用程序中,因为 UIBarButtonItem 不符合 UIView,因此无法使用 UIViewRepresentable 引入。

我也尝试过将 SWCollaborationView 包裹在 UIViewRepresentable 中,直接引入。 结果与这篇文章相同。 当我将它包裹在 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 不兼容,我们应该提交反馈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM