[英]Swiftui - Delete List row
I want to delete a list's row.我想删除列表的行。
I have followed Apple's official SwiftUI tutorials to build this part of my App.我已经按照 Apple 的官方 SwiftUI 教程来构建我的应用程序的这一部分。 You can download SwiftUI Essentials - Handling User Input from https://developer.apple.com/tutorials/swiftui/handling-user-input if you wish so.
如果您愿意,可以下载 SwiftUI Essentials -从https://developer.apple.com/tutorials/swiftui/handling-user-input处理用户输入。
I am using onDelete
modifier to delete rows.我正在使用
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)
}
})
It works as long as you do not navigate to LandmarkDetail
view.只要您不导航到
LandmarkDetail
视图,它就可以工作。 If you do so, the app crushes due to Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
.如果你这样做,应用程序会因为
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
崩溃。 It is because as you see in the following code, firstIndex
is forced unwrapped.这是因为正如您在下面的代码中看到的,
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)
}
}
I can not figure how to allow editing Landmark
in LandmarkDetail
and also be able to delete it.我不知道如何允许在
LandmarkDetail
中编辑Landmark
并能够将其删除。
In order to test, Tap on a row to navigate to LandmarkDetail
and then navigate back to LandmarkList
.为了进行测试,点击一行导航到
LandmarkDetail
,然后导航回LandmarkList
。 Then delete the row that you just tapped on.然后删除您刚刚点击的行。
The problem is you are removing an index from modelData
, but you are sending landmark
object from filteredLandmarks
variable to LandmarkDetail
view (the object is still available in filteredLandmarks
).问题是您正在从
modelData
中删除一个索引,但是您正在将landmark
object 从filteredLandmarks
变量发送到LandmarkDetail
视图(object 仍然在filteredLandmarks
中可用)。 So, inside LandmarkDetail view, the 'modelData' is not contain the 'landmark' variable you provided.因此,在 LandmarkDetail 视图中,“modelData”不包含您提供的“地标”变量。
In LandmarkDetail
view:在
LandmarkDetail
视图中:
var landmarkIndex: Int {
guard let index = modelData.landmarks.firstIndex(where: { return $0.id == landmark.id }) else {
return 0
}
return index
}
OR,或者,
You can try to find out a solution to remove the exact row index from filteredLandmarks
variable.您可以尝试找出一种解决方案,以从
filteredLandmarks
变量中删除确切的行索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.