• Почему происходит ошибка разворачивания инициализированного опционала,?

    @NONAME8 Автор вопроса
    У меня в общем такая проблема.
    Я вызываю в AppDelagate вызываю этот метод, и сравниваю его с условием и в зависимости от этого я инициализирую ViewController входа.

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            
            RegPasswordVC.instance55.viewDidAppear(true)
            if RegPasswordVC.instance55.aaa() == true{
                self.window = UIWindow(frame: UIScreen.main.bounds)
                let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let PasswordVC: PasswordVC = mainStoryboard.instantiateViewController(withIdentifier: "PasswordVC111") as! PasswordVC
                
                self.window?.rootViewController = PasswordVC
                
                self.window?.makeKeyAndVisible()
                return true
            }
            else{
                self.window = UIWindow(frame: UIScreen.main.bounds)
                let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let RegPasswordVC: RegPasswordVC = mainStoryboard.instantiateViewController(withIdentifier: "RegPasswordVC") as! RegPasswordVC
                
                self.window?.rootViewController = RegPasswordVC
                
                self.window?.makeKeyAndVisible()
                
                return true
            }
            
        }
        
        
        func applicationWillTerminate(_ application: UIApplication) {
            PersistenceService.saveContext()
            CoreDataManager.instance.saveContext()
        }


    Но для этого мне нужно в метода aaa() достать значения из CoreData, и в зависимости от наличия значений вернуть false/true.

    Но после после того, что вы мне сказали у меня есть подозрения, что я никак не смогу сделать fetch, потому он может создаться только после выполнения методов в AppDelagate.

    Я правильно думаю?
  • Почему происходит ошибка разворачивания инициализированного опционала,?

    @NONAME8 Автор вопроса
    Ваш первый вариант оказался правильным. Инициализировал 'per2' после 'catch' и заработало.
  • Как сделать так, чтобы строки разных TableViewCell могли смешиваться между собой?

    @NONAME8 Автор вопроса
    andrew8712, добавил в самом вопросе.
    Мне подсказали на другом форуме, что у меня , то что я пытаюсь сделать концептуально неправильно и сказали сделать для нескольких сущностей одну супер-сущность и от нее наследоваться. Так я смогу сортировать строки разных сущностей между собой, потому что они будут относиться к одному разделу.
    Надеюсь мое объяснение будут вам понятно.
  • Как сделать так, чтобы строки разных TableViewCell могли смешиваться между собой?

    @NONAME8 Автор вопроса
    doublench21, нет. Вы мне предложили использовать методы перегрузки секций и строк. Но я даже теоретически не могу понять чем мне это может помочь, поскольку если я выгружу все данные из CoreData , а потом вызову методы перегрузки разделов , то я смогу только пересортировать по отдельности каждый раздел.
    В итоге у меня опять будут просто отдельно отсортированные строки 1 и 2 раздела.
    Мне нужно , чтобы я мог сортировать между собой значения, добавленные из двух разных TableViewCell.
    Я даже в теории не пойму, как описать то, что записи из 2 раздела ( второй TableViewCell ) могут быть выше 1-го раздела. Как я понял, из-за того что записи привязаны к разделу, они всегда будут так группироваться кучками одинаковых записей. То есть , чтобы запись 2-рого раздела была выше она должна быть должна стать записью 1-го раздела ( но это бред какой-то) , но а как же тогда описать, что
    она должна быть размещена выше? И вот на этом моменте непонимания я застрял.
  • Как сделать так, чтобы строки разных TableViewCell могли смешиваться между собой?

    @NONAME8 Автор вопроса
    andrew8712, посмотрите мой предпоследний ответ, я там пишу, что использую сущности CoreData, как источник данных.
  • Как сделать так, чтобы строки разных TableViewCell могли смешиваться между собой?

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

    @NONAME8 Автор вопроса
    Эту таблицу я сделал как пример, чтобы показать что я имею ввиду.

    У меня есть программа, где я из двух разных VC записываю данные в разные сущности CoreData и вывожу их из разных UITableViewCell. И вот записи из первой UITableViewCell всегда выше , чем записи второй.

    5a40ecdfe1644013617136.png

    То есть мне нужно , чтобы "Последняя добавленная запись" была сверху , а она всегда отображается ниже всех записей indexPath 1.

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

    @NONAME8 Автор вопроса
    то есть записи разных TableViewCell могли перемешиваться между собой в таблице

    Я имею ввиду, что записи ( строки ) добавленные от определенной TableViewCell скапливаются в одном месте. Я это хотел показать на скрине, что даже если записи второй TableViewCell ( синей )в приоритете сортировки TableView должны быть наверху, то они всегда ниже , чем любые записи первой TableViewCell( зеленой ).
  • Почему происходит ошибка при отображение данных СoreData в TableView?

    @NONAME8 Автор вопроса
    doublench21, Я изначально хочу для 2 секций. Нет, не работает.

    Я переписал код программы со всеми ее изменениями в самом вопросе.
  • Почему происходит ошибка при отображение данных СoreData в TableView?

    @NONAME8 Автор вопроса
    doublench21, я поменял метод
    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {

    Чтобы обновление было для двух секций

    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
            
            let section = controller == fetchedResultsController ? 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
            }
        }
  • Почему происходит ошибка при отображение данных СoreData в TableView?

    @NONAME8 Автор вопроса
    doublench21, Нашел ошибку, но не понимаю ее причину.

    Если поменять
    func numberOfSections(in tableView: UITableView) -> Int {
            //return 2  на 
    return 1
        }


    Программа запуститься, но при сохранение 2 сущности будет писать в лог такую ошибку:
    2017-12-23 11:26:01.836140+0200 tableViewWithDifferentEntities[60383:3868739] [error] error: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  attempt to insert row 0 into section 1, but there are only 1 sections after the update with userInfo (null)
    CoreData: error: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  attempt to insert row 0 into section 1, but there are only 1 sections after the update with userInfo (null)
    SAVE


    Если поменять возвращаемое значение на 2, то оно пишет:
    Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
  • Почему происходит ошибка при отображение данных СoreData в TableView?

    @NONAME8 Автор вопроса
    doublench21, в первом случае ошибка. Во втором выводит 0.
  • Почему происходит ошибка при отображение данных СoreData в TableView?

    @NONAME8 Автор вопроса
    e sections2
    ([NSFetchedResultsSectionInfo]?) $R0 = some {
    _buffer = {
    _storage = (rawValue = __NSAtom @ scalar(0x8000000000000000))
    }
    }


    ▿ fatal error: NSArray element failed to match the Swift Array Element type
    error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
    The process has been returned to the state before expression evaluation.


    Написало, что несоответствие типов, но такой формат работал, когда я заполнял таблицу данными из одной сущности. Поэтому что тогда его не устраивает ?
  • Как выгрузить в TableView Cells значения из разных сущностей CoreData?

    @NONAME8 Автор вопроса
    Сделал программу с подобным принципом , но вместо разных сущностей СoreData заполнял таблицу разными массивами + сделал переходы по ячейкам. Начал переделывать программу с СoreData по тому же принципе, но она стала выдавать ошибку SIGABART.

    import UIKit
    import CoreData
    
    class TableView: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate{
        
        @IBOutlet weak var tableView: UITableView!
    
        var fetchedResultsController = CoreDataManager.instance.fetchedResultsController("Customer", keyForSort: "name")
        
        var fetchedResultsController2 = CoreDataManager.instance.fetchedResultsController("Seller", keyForSort: "name_seller")
        
        override func viewDidLoad() {
            super.viewDidLoad()
            tableView.delegate=self
            tableView.dataSource=self
            
            fetchedResultsController.delegate = self
            do {
                try fetchedResultsController.performFetch()
            } catch {
                print(error)
            }
            
            fetchedResultsController2.delegate = self
            do {
                try fetchedResultsController2.performFetch()
            } catch {
                print(error)
            }
        }
        
        @IBAction func AddCustomer(_ sender: AnyObject) {
            performSegue(withIdentifier: "customersToCustomer", sender: nil)
        }
        
        @IBAction func AddSeller(_ sender: AnyObject) {
            performSegue(withIdentifier: "sellersToSeller", sender: nil)
        }
        
        // MARK: - Table View Data Source
        
         func numberOfSections(in tableView: UITableView) -> Int {
            return 2
        }
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if section == 0 {
                let sections = fetchedResultsController.sections
                return sections![section].numberOfObjects
            }
            else if section == 1  {
                let sections2 = fetchedResultsController2.sections
                return sections2![section].numberOfObjects
            }
            else {
                return 1
            }
        }
       
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            
    
            if indexPath.section == 0 {
                let cell = tableView.dequeueReusableCell(withIdentifier: "0", for: indexPath) as! TableViewCell
                let customer = fetchedResultsController.object(at: indexPath) as! Customer
                cell.textLabel?.text = customer.name
                return (cell)
                
            } else  {
                let cell2 = tableView.dequeueReusableCell(withIdentifier: "1", for: indexPath) as! TableViewCell2
    
                let seller = fetchedResultsController2.object(at: indexPath) as! Seller
                cell2.textLabel?.text = seller.name_seller
                return (cell2)
            }
        }
        // MARK: - Table View Delegate
      
        func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
            if editingStyle == .delete {
                let managedObject = fetchedResultsController.object(at: indexPath) as! NSManagedObject
                CoreDataManager.instance.managedObjectContext.delete(managedObject)
                CoreDataManager.instance.saveContext()
            }
        }
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let customer = fetchedResultsController.object(at: indexPath) as? Customer
            performSegue(withIdentifier: "customersToCustomer", sender: customer)
            
        }
        
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "customersToCustomer" {
                let controller = segue.destination as! CustomerViewController
                            controller.customer = sender as? Customer
            }
        }
    
        // MARK: - Fetched Results Controller Delegate
        
        func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
            tableView.beginUpdates()
        }
        func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
            
            switch type {
                
            case .insert:
                if let indexPath = newIndexPath {
                    tableView.insertRows(at: [indexPath], with: .automatic)
                }
                
            case .update:
                if let indexPath = indexPath {
                    if indexPath.section == 0{
                        let customer = fetchedResultsController.object(at: indexPath) as! Customer
                        let cell = tableView.cellForRow(at: indexPath)
                        cell!.textLabel?.text = customer.name
                    }
                    else{
                        let seller = fetchedResultsController2.object(at: indexPath) as! Seller
                        let cell2 = tableView.cellForRow(at: indexPath)
                        cell2!.textLabel?.text = seller.name_seller
                    }
                }
      
            case .move:
                if let indexPath = indexPath {
                    tableView.deleteRows(at: [indexPath], with: .automatic)
                }
                if let newIndexPath = newIndexPath {
                    tableView.insertRows(at: [newIndexPath], with: .automatic)
                }
                
            case .delete:
                if let indexPath = indexPath {
                    tableView.deleteRows(at: [indexPath], with: .automatic)
                }
            }
        }
        
        func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
            tableView.endUpdates()
        }
        
    }

    Пока пытался только заполнить таблицу данными, без переходов по ячейкам.
    Но появилась эта ошибка и я не пойму из-за чего она. Как мне кажется это может быть Fetched Results Controller Delegate, но я не знаю что в нем надо изменить.

    Хотя пробовал ставить breakpoint, ошибка вылетает строке
    return sections2![section].numberOfObjects
    метода
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  • Как выгрузить в TableView Cells значения из разных сущностей CoreData?

    @NONAME8 Автор вопроса
    doublench21, и я так и не понял, как все таки заполнять таблицу из разными сущностями.
    Я то создал сами сущности и отдельный FRC для них, но как их вставить в метод таблицы не пойму.

    var fetchedResultsController2 = CoreDataManager.instance.fetchedResultsController("Seller", keyForSort: "name_seller")
    
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let customer = fetchedResultsController.object(at: indexPath) as! Customer
            //let seller = fetchedResultsController2.object(at: indexPath) as! Seller
    
            let cell = UITableViewCell()
    
           // как сюда вот передать значения еще и с  seller.name_seller ???
            cell.textLabel?.text = customer.name
            return cell
        }
  • Как выгрузить в TableView Cells значения из разных сущностей CoreData?

    @NONAME8 Автор вопроса
    doublench21, вроде как идею понял, но вот что вписать вместо data?
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let customer = fetchedResultsController.object(at: indexPath) as? Customer
            let seller = fetchedResultsController2.object(at: indexPath) as? Seller
            
            let data:[Any]?
            switch type(of: data) {
            case is Customer: performSegue(withIdentifier: "customersToCustomer", sender: customer)
            case is Seller: performSegue(withIdentifier: "sellersToSeller", sender: seller)
            default: print(Error.self)
            }
        }

    Пробовал так, но на ячейки просто не переходит. Выводит Error и все.