【问题标题】:Swiftui - Delete List rowSwiftui - 删除列表行
【发布时间】: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) 中?
  • 对象不存在了,为什么你认为你可以访问它?

标签: ios swift swiftui


【解决方案1】:

问题是您正在从modelData 中删除一个索引,但是您正在将landmark 对象从filteredLandmarks 变量发送到LandmarkDetail 视图(该对象在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 变量中删除确切行索引的解决方案。

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2020-06-28
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多