【发布时间】:2020-12-26 12:32:12
【问题描述】:
我想删除列表的行。
我已按照 Apple 的官方 SwiftUI 教程来构建我的应用程序的这一部分。如果您愿意,可以从https://developer.apple.com/tutorials/swiftui/handling-user-input 下载 SwiftUI Essentials - 处理用户输入。
我正在使用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。然后删除您刚刚点击的行。
【问题讨论】:
-
您是否要查看已删除的对象?
-
@JoakimDanielson 否。我正在尝试删除刚刚查看过的对象。我添加了更多信息。
-
那么为什么不强制解开 firstIndex 返回的值呢?
-
@DanielT。您可以使用可选的 int 访问数组的对象吗,例如在
FavoriteButton(isSet: $modelData.landmarks[landmarkIndex].isFavorite)中? -
对象不存在了,为什么你认为你可以访问它?