繁体   English   中英

Swiftui - 删除列表行

[英]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.

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