gpt4 book ai didi

Swift UI 细节删除

转载 作者:行者123 更新时间:2023-12-05 06:21:19 24 4
gpt4 key购买 nike

我有一个 SwiftUI 列表,它在点击单元格时显示详细 View /推送到导航:

import SwiftUI

struct DevicesInRangeList: View {
@ObservedObject var central = Central()

var body: some View {
NavigationView {
List(central.peripheralsInRange) { peripheral in
NavigationLink(destination: DeviceView(peripheral: peripheral).onAppear {
self.central.connect(peripheral: peripheral)
}.onDisappear {
self.central.disconnect(peripheral: peripheral)
}) {
DeviceRow(deviceID: peripheral.deviceID, name: peripheral.name)
}
}.onAppear {
self.central.scanning = true
}.onDisappear {
self.central.scanning = false
}.navigationBarTitle("Devices in range")
}
}
}

如果我点击一行,就会显示详细信息。如果外围设备断开连接,它会从 peripheralsInRange 数组中删除,并且该行会被删除——但仍会显示详细信息。删除关联行时如何删除详细信息?


编辑:在 Asperi 的回答之后,我得到了以下内容,但仍然不起作用:

struct DevicesInRangeList: View {
@ObservedObject var central = Central()

@State private var localPeripherals: [Peripheral] = []

@State private var activeDetails = false
var body: some View {
NavigationView {
List(localPeripherals, id: \.self) { peripheral in
NavigationLink(destination:
DeviceView(peripheral: peripheral)
.onReceive(self.central.$peripheralsInRange) { peripherals in
if !peripherals.contains(peripheral) {
self.activeDetails = false
}
}
.onAppear {
self.central.connect(peripheral: peripheral)
}
.onDisappear {
self.central.disconnect(peripheral: peripheral)
}
, isActive: self.$activeDetails) {
DeviceRow(deviceID: peripheral.deviceID, name: peripheral.name)
}
}.onReceive(central.$peripheralsInRange) { peripherals in
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.localPeripherals = peripherals
}
}.onAppear {
self.central.scanning = true
self.localPeripherals = self.central.peripheralsInRange
}.onDisappear {
self.central.scanning = false
}.navigationBarTitle("Devices in range")
}
}
}

最佳答案

最好的方法是在显示之前检查是否存在数据。我采用了apple的master/demo来展示如何做。在这个模板应用程序中,他们使用@State var 作为记录源,但想法是一样的。在详细 View 中检查是否存在“记录”。

import SwiftUI

private let dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
return dateFormatter
}()

struct ContentView: View {
@State private var dates = [Date]()

var body: some View {
NavigationView {
MasterView(dates: $dates)
.navigationBarTitle(Text("Master"))
.navigationBarItems(
leading: EditButton(),
trailing: Button(
action: {
withAnimation { self.dates.insert(Date(), at: 0) }
}
) {
Image(systemName: "plus")
}
)
DetailView(dates: $dates).navigationBarTitle(Text("Detail"))
}.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}

struct MasterView: View {
@Binding var dates: [Date]

var body: some View {
List {
ForEach(dates, id: \.self) { date in
NavigationLink(
destination: DetailView(dates: self._dates, selectedDate: date).navigationBarTitle(Text("Detail"))
) {
Text("\(date, formatter: dateFormatter)")
}
}.onDelete { indices in
indices.forEach { self.dates.remove(at: $0) }
}
}
}
}

struct DetailView: View {
@Binding var dates: [Date]
var selectedDate: Date?

var body: some View {
if let selectedDate = selectedDate, dates.contains(selectedDate) {
return Text("\(selectedDate, formatter: dateFormatter)")
} else {
return Text("Detail view content goes here")
}
}
}


struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

enter image description here

关于Swift UI 细节删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59859178/

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