小编Poi*_*urn的帖子

Xcode 12 中新多平台模板的共享单元测试

当您有一个多平台项目时,您如何测试代码的共享部分?我看到了针对 iOS 的测试和针对 macOS 的测试,但没有针对共享部分的测试。我想为我的应用程序的平台独立部分添加单元测试。

xcode unit-testing xcode12

8
推荐指数
2
解决办法
343
查看次数

当需要 iCloud 时如何处理首次启动体验?

我用来CloudKit存储公开可用的数据,并将新数据NSPersistentCloudKitContainer作为我的核心数据堆栈的一部分来存储/同步私有数据。

当用户打开我的应用程序时,他们处于以下 4 种状态之一:

  1. 他们是有权访问 iCloud 的新用户
  2. 他们是可以访问 iCloud 的回访用户
  3. 他们是新用户,但由于某种原因无法访问 iCloud
  4. 他们是回访用户,但由于某种原因无法访问 iCloud

状态 1 和状态 2 代表我的快乐路径。如果他们是新用户,我想在显示初始视图之前向用户的私人存储添加一些数据。如果他们是回头客,我想从核心数据中获取数据以传递到初始视图。

确定新/老用户: 我的计划是使用NSUbiquitousKeyValueStore. 我对此的担忧是处理以下情况: 下载应用程序 -> 被记录为之前启动过该应用程序 -> 删除并在新设备上重新安装/安装该应用程序 我认为NSUbiquitousKeyValueStore需要一些时间才能接收更新,因此我需要等待其完成同步,然后再进入初始视图。那么问题来了,如果他们无法访问 iCloud 会发生什么?NSUbiquitousKeyValueStore如果无法收到更新,如何告诉我他们是否是回访用户?

确定 iCloud 访问: 根据我所做的研究,我可以检查iCloudFileManager.default.ubiquityIdentityToken是否nil可用,但这不会告诉我原因。我必须用它CKContainer.default().accountStatus来了解为什么 iCloud 不可用。问题是这是一个异步调用,我的应用程序在了解他们的帐户状态是什么之前就会继续前进。

我对这个实在是摸不着头脑。优雅地确保所有这些状态都得到处理的最佳方法是什么?

core-data ios nsubiquitouskeyvaluestore cloudkit nspersistentcloudkitcontainer

6
推荐指数
1
解决办法
732
查看次数

UndoManager 的 canUndo 属性未在 SwiftUI 中更新

当堆栈中有操作时,为什么不@Environment UndoManager更新其属性?canUndo我有一个视图,它的子视图可以利用取消/重做功能,但由于某种原因,我无法根据管理器禁用撤消按钮。

struct MyView: View {
    @Environment(\.undoManager) var undoManager: UndoManager?

    var body: some View {
        Button("Undo") { ... }
            .disabled(!self.undoManager!.canUndo)
    }
}
Run Code Online (Sandbox Code Playgroud)

nsundomanager swiftui

5
推荐指数
1
解决办法
1589
查看次数

使用 SwiftUI 实现 PencilKit 撤消功能

编辑:感谢一些反馈,我已经能够部分工作(更新代码以反映当前更改)。

即使该应用程序似乎按预期工作,我仍然收到“正在修改状态...”警告。如何updateUIViewcanvasViewDrawingDidChange不导致此问题的情况下更新视图的绘图并将新绘图推入堆栈?我尝试将它包装在调度调用中,但这只会创建一个无限循环。


我正在尝试在UIViewRepresentable( PKCanvasView) 中实现撤消功能。我有一个父 SwiftUI 视图WriterView,其中包含两个按钮和画布。

这是父视图:

struct WriterView: View {
    @State var drawings: [PKDrawing] = [PKDrawing()]

    var body: some View {
        VStack(spacing: 10) {
            Button("Clear") {
                self.drawings = []
            }
            Button("Undo") {
                if !self.drawings.isEmpty {
                    self.drawings.removeLast()
                }
            }
            MyCanvas(drawings: $drawings)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我如何实施我的UIViewRepresentable

struct MyCanvas: UIViewRepresentable {
    @Binding var drawings: [PKDrawing]

    func makeUIView(context: Context) -> PKCanvasView {
        let canvas = PKCanvasView()
        canvas.delegate = context.coordinator
        return …
Run Code Online (Sandbox Code Playgroud)

swiftui uiviewrepresentable pencilkit

1
推荐指数
1
解决办法
1813
查看次数