上下文:我的应用是使用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) 我假设 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) 我想要响应按键,例如escmacOS/OSX 上的按键以及在 iPad 上使用外部键盘时的按键。我怎样才能做到这一点?
我曾想过将@available/#available与 SwiftUI 一起使用onExitCommand,这看起来很有前途,但不幸的是这只适用于 macOS/OSX。除了 macOS/OSX 之外,如何响应 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) 我试图理解一种设计模式,用于从 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,并在主线程上更新自身,但会出现编译时错误 …
我试图List在编辑模式下重新排列行。
快速摘要:我希望DisclosureGroup行Second不被插入到它们自己的子层次结构中。如果他们进入任何其他层次结构/级别也没关系。
下面是一些示例代码:
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) 我有一个基于回调的 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 中使用非结构化并发来帮助我实现这一目标?
我想单击 SwiftUI 中的一个按钮来触发 JSON 编码操作。此操作非常耗时,因此我需要它是异步的。我已经尝试了两种解决方案,但它们不起作用。一个主要问题是如何创建异步版本的 json 编码?
\n解决方案1)
\npublic 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) 我有一个 SwiftUI 应用程序,其中有一个 SpriteKit 场景。但是,在浅色和深色模式之间切换时,场景背景不会改变颜色,直到重新打开应用程序。
这并不理想,所以我想在更改明/暗模式外观时进行注册。我的资源中的颜色具有“任何”和“深色”外观。
updateUIView()结构体内部的代码UIViewRepresentable,在与 SwiftUI 链接时设置场景:
scene.backgroundColor = UIColor(named: "Color.Scene")!
uiView.presentScene(scene)
Run Code Online (Sandbox Code Playgroud)
我该如何实现这一目标?我正在使用iOS 13的系统宽暗模式,所以我不想要通知中心的解决方案,因为我想要做的就是根据系统设置更新背景。
正如您从屏幕截图中看到的,“语言”选项卡出现了两次。
我有以下 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) swift ×9
swiftui ×9
ios ×3
async-await ×2
sprite-kit ×2
appdelegate ×1
asynchronous ×1
button ×1
concurrency ×1
ios15 ×1
macos ×1
swiftui-list ×1
tabbar ×1
tabview ×1
uiimage ×1