2016-11-23 2 views
0

Я работаю над проектом в swift 3.0, и у меня есть два UITableViews, где я устанавливаю данные, полученные с объекта модуля ядра данных, называемого UserIncome. Поскольку эти данные будут заполнены в двух UItableViews в одном UIViewController (фильтрация на основе значения String в методе делегата ViewWillAppear), как только строка будет удалена в одном UITableView, его массив автоматически будет обновляться и другими объектами tableView. Но как только я нажимаю кнопку «Назад» и возвращаюсь к тому же UIViewController, все кажется прекрасным. Мое требование - обновить UItableView, как только строка будет удалена, так как основной модуль данных. Код ниже. Что мне здесь не хватает?UITableView не обновляется после удаления строки

import UIKit 
import CoreData 

class MyIncomesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
    @IBOutlet weak var recurringIncomeTableView: UITableView! 
    @IBOutlet weak var otherIncomeTableView: UITableView! 
    //var myIncomeType : String? 

    var stores = [UserIncome]() 
    var other = [UserIncome]() 
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

    var rowTbl : Int! 
    var rowTbl2 : Int! 



    override func viewDidLoad() { 
     super.viewDidLoad() 

} 
    override func viewDidAppear(_ animated: Bool) { 

     stores.removeAll() 
     other.removeAll() 

     let request = NSFetchRequest <NSFetchRequestResult> (entityName: "UserIncome") 
     request.returnsObjectsAsFaults = false 



     do { 

      let results = try context.fetch(request) as! [UserIncome] 

      print("Results from the fetch request are : ", request) 

      // check data existance 
      if results.count>0 { 
       print("results are :", results.count) 

       for resultGot in results { 

        //lets check if the data is available and whether the loop is working by printing out the "name" 
        if let incName = resultGot.incomeName { 
         print("expence name is :", incName) 

         //set the value to the global variable as to filter the arrays 
         let myIncomeType = resultGot.incomeType 

         if myIncomeType == "Recurring Income"{ 

          stores += [resultGot] 
          print("my recurring income array is : \(stores)") 
         }else if myIncomeType == "Other Income"{ 

          other += [resultGot] 
          print("my other income array is : \(other)") 
         } 
        } 
       } 
       self.recurringIncomeTableView.reloadData() 
       self.otherIncomeTableView.reloadData() 

      } 

     }catch{ 


      print("No Data to load") 
     } 


    } 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     if tableView.tag == 1 { 
     let cell: RecuringIncomeTableViewCell = tableView.dequeueReusableCell(withIdentifier: "recurringIncomeCell") as! RecuringIncomeTableViewCell 

     let store = stores [indexPath.row] 

     cell.incomeNameLabel.text = store.incomeName 
     cell.amountLabel.text = store.amount 


     return cell 

     } 
     else { 
      let cell: OtherIncomeTableViewCell = tableView.dequeueReusableCell(withIdentifier: "otherIncomeCell") as! OtherIncomeTableViewCell 

      let otherIncomes = other [indexPath.row] 

      cell.incomeNameLabel.text = otherIncomes.incomeName 
      cell.amountLabel.text = otherIncomes.amount 


      return cell 

     } 
    } 




    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     //performSegue(withIdentifier: "editStore", sender: nil) 
     if tableView.tag == 1 { 
      rowTbl = tableView.indexPathForSelectedRow?.row 
      print("current row in tbl 1 is : ",rowTbl) 

     }else { 

      rowTbl2 = tableView.indexPathForSelectedRow?.row 
      print("current row in tbl 2 is : ",rowTbl2) 
     } 

    } 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "editRecurringIncome"{ 

      let v = segue.destination as! AddIncomeViewController 
      let indexPath = self.recurringIncomeTableView.indexPathForSelectedRow 
      let row = indexPath?.row 
      v.store = stores[row!] 

     }else if segue.identifier == "editOtherIncome" { 
      let t = segue.destination as! AddIncomeViewController 
      let indexPath = self.otherIncomeTableView.indexPathForSelectedRow 
      let row = indexPath?.row 
      t.store = other [row!] 

     } 
    } 

//  

    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
     print("delete delegate being activated") 
     return true 
    } 

    //For remove row from tableview & object from array. 
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
     if tableView.tag == 1 { 
      if editingStyle == .delete { 
       let task = stores [indexPath.row] 
       context.delete(task) 
       (UIApplication.shared.delegate as! AppDelegate).saveContext() 


       do { 
        stores = try context.fetch(UserIncome.fetchRequest()) 
        print("Stores deleted from indexPath",stores) 
       }catch{ 
        print("fail") 
       } 


       recurringIncomeTableView.reloadData() 

      } 

      self.recurringIncomeTableView.reloadData() 

     } else if tableView.tag == 2 { 
      if editingStyle == .delete { 
       let task = other[indexPath.row] 
       print("task on otherTblView is : ",task) 
       context.delete(task) 
       (UIApplication.shared.delegate as! AppDelegate).saveContext() 
       otherIncomeTableView.reloadData() 

       do { 
        other = try context.fetch(UserIncome.fetchRequest()) 
        print("Stores deleted from indexPath",other) 
       }catch{ 
        print("fail") 
       } 

     } 


      self.otherIncomeTableView.reloadData() 
     } 
     tableView.reloadData() 


    } 


} 
+0

почтовый индекс TableView тоже, где вы пишете содержание в нем ... –

+0

Именно там сэр – danu

+0

Try позвонить viewDidAppear() не tableView.reloadData() внутри Func Tableview (_ Tableview: UITableView, совершают editingStyle: UITableViewCellEditingStyle, forRowAt indexPath : IndexPath) – Rob

ответ

1

вам необходимо удалить задачу, как таким образом

let task = stores [indexPath.row] 
context.delete(task) 
stores.removeAtIndex(indexPath.row) // i think you forget this line 
(UIApplication.shared.delegate as! AppDelegate).saveContext() 

попробовать это, надеюсь, это поможет вам

+0

Я тоже это сделал, но, похоже, все тот же. Например, если я удалю строку в моем первом табличном представлении, значения другого tableView будут автоматически заполняться для этого tableView. Был бы очень признателен, если бы вы могли помочь мне с этим маленьким вопросом – danu

0

Объект данных ядро ​​не действительно содержат никакой информации. Он имеет указатель на контекст и идентификатор, поэтому, когда вы запрашиваете у него информацию, он отправляется в магазин, чтобы спросить. Если объект удаляется из контекста, тогда объект управления, который вы сохранили в вашем массиве, больше не будет работать и сработает. Вот почему вы никогда не должны сохранять NSManagedObjects. Либо

a) Скопируйте значения из данных ядра в другой объект. Когда вы хотите удалить объект, вы должны удалить его как из хранилища, так и из копии, которую вы сохраняете. Если новые объекты вставлены или они удалены из какого-либо другого источника вне вашего viewController, он не будет обновляться (но также и не сбой).

b) Используйте NSFetchedResultsController и обновите результаты при изменении значений. Это даст делегату рассказать вам, когда произойдут изменения. Итак, все, что вам нужно сделать, это удалить объект из магазина, а затем fetchedResultsController расскажет вам, когда его удалить.