2017-03-03 26 views
3

我想從Tableview中刪除一個項目,如果SearchBar爲空(indexPath是正確的索引),一切工作正常。但如果我使用SearchBar我得到過濾項目的索引。如何從TableBar中獲取Tableview中所有項目的當前項目的索引

如何從Tableview中獲取項目的當前索引?但用SearchBar過濾後。

func filterTableView(ind:Int,text:String) { 
     switch ind { 
     case selectedScope.reviewDate.rawValue: 
      filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in 
       return mod.reviewDate.lowercased().contains(text.lowercased()) 
      }) 
      self.tableView.reloadData() 

     case selectedScope.reviewPlace.rawValue: 
      filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in 
       return mod.reviewPlace.lowercased().contains(text.lowercased()) 
      }) 
      self.tableView.reloadData() 

     case selectedScope.reviewSum.rawValue: 
      filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in 
       return mod.reviewSum.lowercased().contains(text.lowercased()) 
      }) 
      self.tableView.reloadData() 

     } 
    } 


static var reviewDaysArr:[ReviewDay] = [ 

    ReviewDay(reviewDate: "03/03/2017", reviewPlace: "Manhattan"), 
    ReviewDay(reviewDate: "03/03/2017", reviewPlace: "Manhattan"), 
    ReviewDay(reviewDate: "05/03/2017", reviewPlace: "New Jersey") 

] 

var filteredDays = reviewDaysArr 

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 
     ViewController.reviewDaysArr.remove(at: indexPath.row) 
     filteredDays = ViewController.reviewDaysArr 
     tableView.deleteRows(at: [indexPath], with: .fade) 
    } 
} 
+0

篩選主數組而不是重新載入您的表視圖 – Dhiru

+0

還要添加您如何篩選數據的代碼。 –

+0

@NiravD done ... –

回答

1

您可以從您的過濾數組中獲取主數組的索引。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 
     //First check using your condition that is search active 
     if searchActive { 
      //I'm comparing movieId you can compare any unique property of your Movie class 
      if let index = ViewController.dataArr.index(where: {$0.movieId == filterdData[indexPath.row].movieId}) { 
       //Remove object from mainArray 
       ViewController.dataArr.remove(at: index) 
       //Remove object from filtered array 
       filterdData.remove(at: indexPath.row) 
      } 
     } 
     else { 
      ViewController.dataArr.remove(at: indexPath.row) 
     } 
     tableView.deleteRows(at: [indexPath], with: .fade) 
    } 
} 

編輯:由於你是不是有您的模型類Movie任何獨特的屬性,只有一個方式來獲得對象的索引。您需要獲得與主數組對應的過濾數組的索引數組。因此,聲明一個類型爲[Int]的數組,並在過濾數組後獲取該數組中的過濾器對象索引。

var filterIndices = [Int]() 

現在您正在過濾數組,也會初始化此數組。

switch ind { 
    case selectedScope.reviewDate.rawValue: 
     filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in 
      return mod.reviewDate.lowercased().contains(text.lowercased()) 
     }) 
     filterIndices = ViewController.reviewDaysArr.indices.filter({ 
      ViewController.reviewDaysArr[$0].reviewDate.lowercased().contains(text.lowercased()) 
     }) 
     self.tableView.reloadData() 

    case selectedScope.reviewPlace.rawValue: 
     filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in 
      return mod.reviewPlace.lowercased().contains(text.lowercased()) 
     }) 
     filterIndices = ViewController.reviewDaysArr.indices.filter({ 
      ViewController.reviewDaysArr[$0].reviewPlace.lowercased().contains(text.lowercased()) 
     }) 
     self.tableView.reloadData() 

    case selectedScope.reviewSum.rawValue: 
     filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in 
      return mod.reviewSum.lowercased().contains(text.lowercased()) 
     }) 
     filterIndices = ViewController.reviewDaysArr.indices.filter({ 
      ViewController.reviewDaysArr[$0].reviewSum.lowercased().contains(text.lowercased()) 
     }) 
     self.tableView.reloadData() 
} 

現在commit editingStyle得到這個指數的形式排列,並從主,濾波器陣列刪除的對象。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 
     //First check using your condition that is search active 
     if searchActive { 
      //Remove object from mainArray using filterIndices 
      ViewController.reviewDaysArr.remove(at: filterIndices[indexPath.row]) 
      //Remove object from filtered array 
      filteredDays.remove(at: indexPath.row) 
     } 
     else { 
      ViewController.reviewDaysArr.remove(at: indexPath.row) 
     } 
     tableView.deleteRows(at: [indexPath], with: .fade) 
    } 
} 
+0

@MarryG然後你可以使用你在單元格中顯示的電影名稱 –

+0

在我的情況下,我沒有任何電影ID或某個對象唯一的東西。截圖只是爲了解釋我的觀點。 在我的對象中,我只有會議和地點的日期,但這不是唯一的... –

相關問題