Как сделать так, чтобы строки разных TableViewCell могли смешиваться между собой?

Есть TableView и 2 TableViewCell, каждая из которых выводит данные из своего массива.
И в таблице , записи из первой TableViewCell сортируются между собой , а значений второй TableViewCell сортируется между собой после всех записей первой TableViewCell.

5a40cd5d890bd317145480.png

Как сделать так , чтобы записи сортировались в таблице по последнему добавлению?
И чтобы если последней была добавлена запись из второй TableViewCell, то она была выше всех?
( то есть записи разных TableViewCell могли перемешиваться между собой в таблице )

import UIKit
import CoreData

class TableView: UIViewController,  UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate{
  
    @IBOutlet weak var myTableView: UITableView!
    
    var m = "indexPath1"
    var m2 = "indexPath2"

    
    var fetchedResultsController1 = CoreDataManager.instance.fetchedResultsController("Customer", keyForSort: "name")
    
    var fetchedResultsController2 = CoreDataManager.instance.fetchedResultsController("Seller", keyForSort: "name_seller")
    
   
    
    override func viewDidLoad() {
        
        super.viewDidLoad()
        myTableView.delegate=self
        myTableView.dataSource=self
        
        fetchedResultsController1.delegate = self
        fetchedResultsController2.delegate = self

        
        do {
            try fetchedResultsController1.performFetch()
        } catch {
            print(error)
            
        }
        do {
            try fetchedResultsController2.performFetch()
        } catch {
            print(error)
            
        }
       
    
    }
  
    
    
    
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            let sections = fetchedResultsController1.sections
            return sections![0].numberOfObjects
        }
        else {
            let sections = fetchedResultsController2.sections
            return sections![0].numberOfObjects
        }
        
        
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "0", for: indexPath) as! TableViewCell
            let customer = fetchedResultsController1.object(at: indexPath) as! Customer
            cell.textLabel?.text = customer.name
            cell.detailTextLabel?.text = m

            return (cell)
        }
        else {
            let cell2 = tableView.dequeueReusableCell(withIdentifier: "1", for: indexPath) as! TableViewCell2
            let seller = fetchedResultsController2.object(at: [0, indexPath.row]) as! Seller
            cell2.textLabel?.text = seller.name_seller
            cell2.detailTextLabel?.text = m2
            
            return (cell2)
            
        }
        
    }
    
    
    
    @IBAction func AddCustomer(_ sender: AnyObject) {
        performSegue(withIdentifier: "customersToCustomer", sender: nil)
    }
    
    @IBAction func AddSeller(_ sender: AnyObject) {
        performSegue(withIdentifier: "sellersToSeller", sender: nil)
    }
    
   
    
    // MARK: - Table View Delegate
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        
        if editingStyle == .delete {
            
            if indexPath.section == 0 {
            let managedObject = fetchedResultsController1.object(at:indexPath) as! NSManagedObject
            CoreDataManager.instance.managedObjectContext.delete(managedObject)
            CoreDataManager.instance.saveContext()
            }
            else{
                let managedObject2 = fetchedResultsController2.object(at: [0, indexPath.row]) as! NSManagedObject
                CoreDataManager.instance.managedObjectContext.delete(managedObject2)
                CoreDataManager.instance.saveContext()
            }
            
        }
        
    }
    
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.section == 0{
            let customer = fetchedResultsController1.object(at: indexPath) as? Customer
            performSegue(withIdentifier: "customersToCustomer", sender: customer)
        } else{
            let seller = fetchedResultsController2.object(at: [0, indexPath.row]) as? Seller
            performSegue(withIdentifier: "sellersToSeller", sender: seller)
        }
        
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "customersToCustomer" {
            let controller = segue.destination as! CustomerViewController
            controller.customer = sender as? Customer
        } else{
            let controller2 = segue.destination as! SellerViewController
            controller2.seller = sender as? Seller
        }
    }
    
    func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
        myTableView.beginUpdates()
        
    }
    
    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
        
        
        let section = controller == fetchedResultsController1 ? 0 : 1
        switch type {
        case .insert:
            myTableView.insertRows(at: [[section, newIndexPath!.row]], with: .automatic)

        case .update:
            if section == 0 {
                let customer = controller.object(at: indexPath!) as! Customer
                let cell = myTableView.cellForRow(at: [0, indexPath!.row])
                cell!.textLabel?.text = customer.name
            }
            else {
                let seller = controller.object(at: indexPath!) as! Seller
                let cell2 = myTableView.cellForRow(at: [1, indexPath!.row])
                cell2!.textLabel?.text = seller.name_seller
            }
        case .delete:
            myTableView.deleteRows(at: [[section, (indexPath?.row)!]], with: .automatic)
        default: break
        }
    }
    
    func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
     
        myTableView.endUpdates()
    }
    
    
}
  • Вопрос задан
  • 363 просмотра
Пригласить эксперта
Ответы на вопрос 1
doublench21
@doublench21 Куратор тега Swift
Читаю Ваш вопрос уже пятый раз, всё никак не могу понять что же Вы хотите. Выражайтесь проще.
то есть записи разных TableViewCell могли перемешиваться между собой в таблице
- ну так Вы ведь сами определяете какого типа будет ячейка для текущего indexPath. В чём проблема?
Как сделать так , чтобы записи сортировались в таблице по последнему добавлению?
- данные сортируются либо предикатами CoreData, а если для Вас это не работает и Вам надо отсортировать то, что уже и так показано в таблице, то отсортируйте ваш массив с данными так как Вам надо и вызовите метод reloadData() вашего tableView. Это операция очень затрата, если ваша таблица очень большая, там есть и другие методы, проще. Смотрите документацию UITableView https://developer.apple.com/documentation/uikit/ui...

LOPaNk4pQ6_0wNTXOkEvzg.jpg
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы