gpt4 book ai didi

SwiftUI:拖入空列表时崩溃

转载 作者:行者123 更新时间:2023-12-04 15:14:13 25 4
gpt4 key购买 nike

在 iOS 和 macOS 上的 Xcode 12.1 上的 SwiftUI 中,当将对象拖动到空列表时,[UITableViewRowData numberOfRowsInSection:] () 发生内部崩溃并且没有命令行输出。

即使我尝试使用列表中的 .onInsert(...) 处理掉落,它仍然会崩溃。 (永远不会调用 onInsert 闭包)

这是要重现的最小示例:

struct ContentView: View {
let string = "Hello World"

var body: some View {
HStack {
Text(string) // Object to drag
.onDrag({NSItemProvider(object: string as NSString)})

List {} // When dragging object onto here, there's a crash
}
}
}

我做错了什么?

最佳答案

是的,通过崩溃分析,它看起来像是 SwiftUI 缺陷,值得向 Apple 报告反馈。

这是处理这种情况的可能方法,它是安全的,并且即使/在 Apple 修复崩溃后也能继续工作。

使用 Xcode 12/iOS 14 测试(为演示添加列表边框)

demo

import SwiftUI
import UniformTypeIdentifiers

struct ContentView: View {
let string = "Hello World"
@State private var items: [String] = []

// border with highlight added just for better visibility
@State private var dragOver = false

var body: some View {
HStack {
Text(string) // Object to drag
.onDrag({NSItemProvider(object: string as NSString)})

List {
ForEach(items, id: \.self) {
Text($0)
}
.onInsert(of: [.text]) { index, providers in
self.handle(providers: providers, index: index)
}
}
.overlay(helperOverlay()) // << helper to handle empty list
.border(dragOver ? Color.red : Color.green, width: 4) // << just for demo
}
}

private func helperOverlay() -> some View {
Group {
if items.isEmpty {
Color.white.opacity(0.0001) // << should be something opaque
.onDrop(of: [.text], isTargeted: $dragOver) { providers -> Bool in
self.handle(providers: providers)
return true
}
}
}
}

private func handle(providers: [NSItemProvider], index: Int? = nil) {
guard let provider = providers.first else { return }
provider.loadDataRepresentation(forTypeIdentifier: "public.text") { (data, _) in
guard let data = data, let value = String(data: data, encoding: .utf8) else { return }
if let index = index {
items.insert(value, at: index)
} else {
items.append(value)
}
}
}
}

关于SwiftUI:拖入空列表时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64612021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com