[英]Swiftui - Delete List row
我想删除列表的行。
我已经按照 Apple 的官方 SwiftUI 教程来构建我的应用程序的这一部分。 如果您愿意,可以下载 SwiftUI Essentials -从https://developer.apple.com/tutorials/swiftui/handling-user-input处理用户输入。
我正在使用onDelete
修饰符来删除行。
ForEach(filteredLandmarks) { landmark in
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
.onDelete(perform: { indexSet in
for index in indexSet {
self.modelData.landmarks.remove(at: index)
}
})
只要您不导航到LandmarkDetail
视图,它就可以工作。 如果你这样做,应用程序会因为Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
崩溃。 这是因为正如您在下面的代码中看到的, firstIndex
被强制解包。
struct LandmarkDetail: View {
@EnvironmentObject var modelData: ModelData
var landmark: Landmark
var landmarkIndex: Int {
modelData.landmarks.firstIndex(where: { $0.id == landmark.id })!
}
var body: some View {
FavoriteButton(isSet: $modelData.landmarks[landmarkIndex].isFavorite)
}
}
我不知道如何允许在LandmarkDetail
中编辑Landmark
并能够将其删除。
为了进行测试,点击一行导航到LandmarkDetail
,然后导航回LandmarkList
。 然后删除您刚刚点击的行。
问题是您正在从modelData
中删除一个索引,但是您正在将landmark
object 从filteredLandmarks
变量发送到LandmarkDetail
视图(object 仍然在filteredLandmarks
中可用)。 因此,在 LandmarkDetail 视图中,“modelData”不包含您提供的“地标”变量。
在LandmarkDetail
视图中:
var landmarkIndex: Int {
guard let index = modelData.landmarks.firstIndex(where: { return $0.id == landmark.id }) else {
return 0
}
return index
}
或者,
您可以尝试找出一种解决方案,以从filteredLandmarks
变量中删除确切的行索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.