【问题标题】:i want to delete multiple photos which are selected by user我想删除用户选择的多张照片
【发布时间】:2016-02-09 19:13:00
【问题描述】:

enter image description here

 func OnDelPressed(){

    let selectedItem = self.collection.indexPathsForSelectedItems()
    print(selectedItem?.count)
    deleteItemsAtIndexPaths(selectedItem!)

}
func deleteItemsAtIndexPaths(indexPaths: [NSIndexPath]){
    for indexpath in indexPaths{
        //print(photos[indexpath.item])
        print("index number is: \(indexpath.row)")
        print(photos[indexpath.row])
        print("number of photos are :\(photos.count)")

        let app = UIApplication.sharedApplication().delegate as! AppDelegate
        let context = app.managedObjectContext

        let photo = photos[indexpath.row] as NSManagedObject
        context.deleteObject(photo)
        do{
            photos.removeAtIndex(indexpath.item)
            try context.save()

        }catch{
            let saveError = error as NSError
            print(saveError)
        }
        collection.reloadData()

    }
}

我可以一次删除两张照片。当我选择三张照片时,它会给出绑定错误的数组索引。我现在没主意了!!

【问题讨论】:

  • 发布你的代码并描述更多

标签: ios iphone arrays swift core-data


【解决方案1】:

从数组中删除项目后,您的索引路径不再保证有效。

for indexpath in indexPaths{
    ...
    context.deleteObject(photo)
    do {
        photos.removeAtIndex(indexpath.item)
        try context.save()

当您从数组中删除照片时,您正在更改数组中的项目数,但索引路径仍然引用删除内容之前数组中的项目位置。因此,如果您的数组是 [a, b, c] 并且您删除索引 0 处的项目,然后删除索引 2 处的项目,那么您的数组将变为 [b, c] 并且索引 2 处不再有项目,因此它会崩溃。如果您倒退(删除索引 2 处的项目,然后删除索引 0 处的项目),它将按您的意愿工作。

【讨论】:

    【解决方案2】:

    欢迎来到编程的世界。当你在编程中通过索引号循环删除东西时,你需要从末尾向后循环。例如,如果你有 4 个东西,删除索引 3 处的那个,然后删除索引 2 处的那个,然后索引 1 处的那个,然后索引 0 处的那个。

    如果你不这样做,你会得到一个越界错误。想想看。假设我们有一个包含 4 个项目的数组,我们从 0 循环到 3 以删除它们。所以:

    1. 我们删除索引 0 处的那个。现在一切都向下移动,所以数组在索引 0、1 和 2 处都有一些东西。

    2. 我们删除索引 1 处的那个(现在缺少索引 0 处的那个,这已经是一个错误)。现在数组在索引 0 和 1 处有一些东西。

    3. 我们尝试删除索引 2 处的那个并崩溃,因为不再有这样的索引。

    然而,如果我们只是删除索引 3 处的那个,然后删除索引 2 处的那个,然后索引 1 处的那个,然后索引 0 处的那个,一切都会好起来的。

    【讨论】:

      【解决方案3】:

      谢谢。我通过这样做解决了这个错误

        ` func deleteItemsAtIndexPaths(indexPaths: [NSIndexPath]){
          var indexRef:[Int]!
          var secondIndexRef:[Int]!
          if clearImageData > 0{
              saveValue.removeAll()
          }
          for indexpath in indexPaths{
                indexRef = [indexpath.row]
                  secondIndexRef = appendValue(indexRef)
          }
          secondIndexRef = secondIndexRef.sort{$0 > $1}
          print(secondIndexRef)
          for values in secondIndexRef{
              let app = UIApplication.sharedApplication().delegate as! AppDelegate
              let context = app.managedObjectContext
              print (values)
              let photo = photos[values] as NSManagedObject
              context.deleteObject(photo)
              do{
      
                  photos.removeAtIndex(values)
                  try context.save()
                  clearImageData++
      
              }catch{
                  let saveError = error as NSError
                  print(saveError)
              }
              collection.reloadData()
      
          }
      }
      func appendValue(getValue:[Int])->[Int]{
           saveValue = saveValue + getValue
          return saveValue
      }
      

      `

      【讨论】:

      • 如果上述任何答案帮助您找到解决方案,您应该通过将其标记为已接受和/或投票来给予他们信任。
      • 好吧。我会这样做的
      猜你喜欢
      • 1970-01-01
      • 2012-10-24
      • 2021-03-30
      • 2018-01-12
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      相关资源
      最近更新 更多