简体   繁体   English

Swiftui - 删除列表行

[英]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并能够将其删除。


Info信息

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM