小编Geo*_*e_E的帖子

应用程序崩溃,出现UIApplicationEndBackgroundTaskError

上下文:我的应用是使用SwiftUI制作的,SwiftUI是使用SpriteKit的游戏。

在设备上按下主屏幕按钮时,我的应用遇到了名为“ UIApplicationEndBackgroundTaskError” 的错误。日志如下所示:

Can't end BackgroundTask: no background task exists with identifier 1 (0x1), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.

我已经尝试过创建断点,但是它并没有提供我所了解的任何有用信息。没有日志,仅显示“调试导航器”。

调试导航器

我试图调查问题的出处。我只是添加了一些简单的打印语句。Update在断点暂停应用程序之前,打印会快速重复几次:

struct SceneView: UIViewRepresentable {

    let bounds: CGRect


    // Conformance to UIViewRepresentable
    func makeUIView(context: Context) -> SKView {
        SKView(frame: bounds)
    }
    func updateUIView(_ uiView: SKView, context: Context) {
        print("Update")

        let scene = Scene(size: bounds.size)
        uiView.ignoresSiblingOrder = true
        uiView.showsFPS = true
        uiView.showsDrawCount = true
        uiView.showsNodeCount = true
        uiView.presentScene(scene)
    } …
Run Code Online (Sandbox Code Playgroud)

ios appdelegate sprite-kit swift swiftui

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

SwiftUI 上下文菜单是否使用 LayoutConstraints?

我假设 SwiftUI 不再使用 NSLayoutContstraints。但是我在控制台中收到约束错误。任何人都知道如何调试?

当我打开上下文菜单时,如果使用列表视图,则会打印出以下内容:

2019-12-09 10:52:52.029091-0700 ContextMenuTest[26384:13138419] [LayoutConstraints] 无法同时满足约束。可能以下列表中的至少一项约束是您不想要的。试试这个: (1) 查看每个约束并尝试找出您不期望的;(2) 找到添加不需要的约束或约束的代码并修复它。(注意:如果看到 NSAutoresizingMaskLayoutConstraints 不明白,请参考 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档) ( "", "= 44 (active, names: groupView.actionsSequence...:0x7fd98781de00 )>", "", "", "", "" )

将尝试通过打破约束 = 44(活动,名称:groupView.actionsSequence...:0x7fd98781de00)来恢复>

在 UIViewAlertForUnsatisfiableConstraints 处创建一个符号断点以在调试器中捕获它。中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。

struct ContentView: View {
    var body: some View {
        List {
            Text("one")
            Text("two")
                .contextMenu(menuItems: {
                    Text("test")
                })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

swiftui

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

响应 SwiftUI 中的按键事件

我想要响应按键,例如escmacOS/OSX 上的按键以及在 iPad 上使用外部键盘时的按键。我怎样才能做到这一点?

我曾想过将@available/#available与 SwiftUI 一起使用onExitCommand,这看起来很有前途,但不幸的是这只适用于 macOS/OSX。除了 macOS/OSX 之外,如何响应 SwiftUI 中的按键操作?

macos keyboard-events ios swift swiftui

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

SwiftUI 视图的快照被部分截断

我尝试UIImage使用 HWS 中的代码从 SwiftUI 视图创建快照:如何将 SwiftUI 视图转换为图像

我得到以下结果,这显然是不正确的,因为图像被截断了。

结果

代码:

struct ContentView: View {
    @State private var savedImage: UIImage?

    var textView: some View {
        Text("Hello, SwiftUI")
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .clipShape(Capsule())
    }

    var body: some View {
        ZStack {
            VStack(spacing: 100) {
                textView

                Button("Save to image") {
                    savedImage = textView.snapshot()
                }
            }

            if let savedImage = savedImage {
                Image(uiImage: savedImage)
                    .border(Color.red)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
extension View {
    func snapshot() -> UIImage {
        let controller = UIHostingController(rootView: self) …
Run Code Online (Sandbox Code Playgroud)

uiimage ios swift swiftui ios15

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

从 SwiftUI 视图中访问参与者的隔离状态

我试图理解一种设计模式,用于从 SwiftUI 视图中访问参与者类型中保存的隔离状态。

采取这个简单的代码:

actor Model: ObservableObject {
    @Published var num: Int = 0
    
    func updateNumber(_ newNum: Int) {
        self.num = newNum
    }
}

struct ContentView: View {
    @StateObject var model = Model()
    
    var body: some View {
        Text("\(model.num)") // <-- Compiler error: Actor-isolated property 'num' can not be referenced from the main actor
        Button("Update number") {
            Task.detached() {
                await model.updateNumber(1)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Actor-isolated property 'num' can not be referenced from the main actor可以理解的是,当我尝试访问隔离值时,我收到了编译器错误。但我不明白如何在视图中显示这些数据。我想知道我是否需要一个 ViewModel 来观察 actor,并在主线程上更新自身,但会出现编译时错误 …

concurrency swift swiftui

7
推荐指数
2
解决办法
3786
查看次数

在编辑模式下使用 DisclosureGroup 重新排列列表

我试图List在编辑模式下重新排列行。

快速摘要:我希望DisclosureGroupSecond不被插入到它们自己的子层次结构中。如果他们进入任何其他层次结构/级别也没关系。

下面是一些示例代码:

struct ContentView: View {
    var body: some View {
        List {
            ForEach(0 ..< 1) { _ in
                DisclosureGroup("First", isExpanded: .constant(true)) {
                    ForEach(0 ..< 1) { _ in
                        Text("Item 1")
                        Text("Item 2")

                        DisclosureGroup("Second", isExpanded: .constant(true)) {
                            // Individual
                            Text("Item 3")
                            Text("Item 4")

                            // Grouped
//                            ForEach(0 ..< 1) { _ in
//                                Text("Item 3")
//                                Text("Item 4")
//                            }
                        }
                    }
                }
            }
            .onMove(perform: { _, _ in })
        }
        .listStyle(.sidebar)
        .environment(\.editMode, …
Run Code Online (Sandbox Code Playgroud)

swift swiftui swiftui-list

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

Swift:如何将“completion”包装到异步/等待中?

我有一个基于回调的 API。

func start(_ completion: @escaping () -> Void)
Run Code Online (Sandbox Code Playgroud)

我想在该 API 之上编写一个 async/await 包装器,将实现推迟到基于原始回调的 API。

func start() async {
    let task = Task()
    start { 
        task.fulfill()
    }
    
    return await task
}
Run Code Online (Sandbox Code Playgroud)

显然,这段代码没有连接 - 它不是真实的,. 上没有fulfill方法Task

问题:有没有办法在 Swift 中使用非结构化并发来帮助我实现这一目标?

asynchronous async-await swift swift-concurrency

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

如何使用 SwiftUI 按钮执行异步操作

我想单击 SwiftUI 中的一个按钮来触发 JSON 编码操作。此操作非常耗时,因此我需要它是异步的。我已经尝试了两种解决方案,但它们不起作用。一个主要问题是如何创建异步版本的 json 编码?

\n

解决方案1)

\n
public func encodeJSON<T>(_ value: T, encoder: JSONEncoder, completionHandler: @escaping (Data?, Error?) -> Void) where T: Encodable {\n        DispatchQueue.global().async {\n            do {\n                let data = try encoder.encode(value)\n                DispatchQueue.main.async {\n                    completionHandler(data, nil)\n                    print("finish encode json")\n                }\n            } catch {\n                DispatchQueue.main.async {\n                    completionHandler(nil, error)\n                    print("fail encode json")\n                }\n            }\n        }\n    }\n    \n    public func encodeJSON<T>(_ value: T, encoder: JSONEncoder) async throws -> Data where T: Encodable {\n        \n        try await withUnsafeThrowingContinuation { continuation …
Run Code Online (Sandbox Code Playgroud)

button async-await swift swiftui swift-concurrency

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

获取亮/暗模式主题更改的更新

我有一个 SwiftUI 应用程序,其中有一个 SpriteKit 场景。但是,在浅色和深色模式之间切换时,场景背景不会改变颜色,直到重新打开应用程序

这并不理想,所以我想在更改明/暗模式外观时进行注册。我的资源中的颜色具有“任何”和“深色”外观。

updateUIView()结构体内部的代码UIViewRepresentable,在与 SwiftUI 链接时设置场景:

scene.backgroundColor = UIColor(named: "Color.Scene")!
uiView.presentScene(scene)
Run Code Online (Sandbox Code Playgroud)

我该如何实现这一目标?我正在使用iOS 13的系统宽暗模式,所以我不想要通知中心的解决方案,因为我想要做的就是根据系统设置更新背景。

sprite-kit swift swiftui

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

在 SwiftUI 中使用 TabView 时,第一个选项卡栏按钮出现两次

正如您从屏幕截图中看到的,“语言”选项卡出现了两次。

第一个 TabView 选项卡出现两次

我有以下 HostingTabBar 代码,该代码在应用程序启动时调用:


struct HostingTabBar: View {
    
    private enum Tab: Hashable {
        case language
        case canvas
        case homework
        case test
        case more
    }
    
    @State private var selectedTab: Tab = .language
    
    var body: some View {
        TabView(selection: $selectedTab) {
        LanguageView()
            .tag(0)
            .tabItem {
                Text("Language")
                Image("language")
            }
        CanvasView()
            .tag(1)
            .tabItem {
                Text("Canvas")
                Image("canvas")
            }
        HomeworkView()
            .tag(2)
            .tabItem {
                Text("Homework")
                Image("homework")
            }
        TestView()
            .tag(3)
            .tabItem {
                Text("Test")
                Image("test")
            }
        MoreView()
            .tag(4)
            .tabItem {
                Text("More")
                Image("more")
            }
        }
        .accentColor(nil)
    }
}

struct HostingTabBar_Previews: …
Run Code Online (Sandbox Code Playgroud)

tabbar tabview swift swiftui

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