Как сохранить идентификатор темы, помеченный как завершенный в TableViewCell - PullRequest
0 голосов
/ 07 мая 2020

Я хочу отслеживать завершенный список тем в TableView

Я установил делегат, который подтверждает tableView topi c пометить как завершенный

protocol TopicDetialVCDelegate: class {
func hasBeenCompletedTopic()

}

TableViewV C

func hasBeenCompletedTopic() {
    isPerformedDelegate = true
    if !completedTopicIdArray.contains(completedTopicId) {
        completedTopicIdArray.append(completedTopicId)
    }
    print("completed Topics \(completedTopicIdArray)")
    print("TopicVC: Completed Topics total: \(completedTopicIdArray.count)")
}

Это работает, но я хочу, чтобы всегда помечалась как завершенная, которая уже отмечена

sample image

Вот код CellForRowAt

  if isPerformedDelegate {
        for _ in 0...completedTopicIdArray.count {
            if completedTopicIdArray.contains(filteredTopicArray[indexPath.row].id!) {
                cell.topicCompletedTickImageView.image = #imageLiteral(resourceName: "Tick")
            }
        }
    }

Что я хочу

Должен быть массив, который получает все завершенные темы idz, и при каждом запуске приложения проверяет, содержит ли путь индекса ячейки topicID show Tick image

Я могу использовать UserDefaults, как это

UserDefaults.standard.set(array, forkey: "abc")

, но проблема в том, что массив снова инициализируется при запуске приложения

как в ViewWillDisappear

 override func viewWillDisappear(_ animated: Bool) {
    UserDefaults.standard.set(completedTopicIdArray, forKey: "completedTopics")
    UserDefaults.standard.synchronize()
}

доступ в ViewDidLoad

let topics = UserDefaults.standard.array(forKey: "completedTopics")
    print(topics as? [Int] ?? [Int]())

1 Ответ

0 голосов
/ 07 мая 2020

Я решил эту проблему с помощью CoreData, хочу поделиться

Объявить пустой массив

 var completedTopicsIdPersistArray: [Int]    = [Int]()

Метод CoreData для создания

fun c persistIdIntoCoreData () {

    guard let appDelegate    = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedObjectContext = appDelegate.persistentContainer.viewContext

    guard let entity = NSEntityDescription.entity(forEntityName: "ComTopicDB", in: managedObjectContext)
        else {
            print("Entity Not Found")
            return
    }

    let topicIdz = NSManagedObject(entity: entity, insertInto: managedObjectContext)
                topicIdz.setValue(completedTopicId, forKey: "topicId")

    do {
        try managedObjectContext.save()
    }
    catch let error as NSError {
        print("Unable to save into CoreData: \(error.userInfo)")
    }
}

Метод CoreData для получения

func retrieveIdFromCoreData() {

    guard let appDelegate    = UIApplication.shared.delegate as? AppDelegate else { return }
    let managedObjectContext = appDelegate.persistentContainer.viewContext
    let fetchRequest         = NSFetchRequest<NSManagedObject>(entityName: "ComTopicDB")

    do {
        let topicIdz = try managedObjectContext.fetch(fetchRequest)
        for id in topicIdz {

            let unwrapId = id.value(forKey: "topicId") as! Int
            if !completedTopicsIdPersistArray.contains(unwrapId) {
                completedTopicsIdPersistArray.append(unwrapId)
            }
        }
    }
    catch let error as NSError {
        print("Found issue during retrieve id from CoreData:\(error.userInfo)")
    }
}

Вызов внутри метода делегата, который подтверждает, что topi c завершено

func hasBeenCompletedTopic() {
    isPerformedDelegate = true
    if !completedTopicIdArray.contains(completedTopicId) {
        completedTopicIdArray.append(completedTopicId)
        persistIdIntoCoreData()
    }
    print("completed Topics \(completedTopicIdArray)")
    print("TopicVC: Completed Topics total: \(completedTopicIdArray.count)")
    retrieveIdFromCoreData()
}

и, наконец, метод CellForRowAt

if completedTopicsIdPersistArray.contains(filteredTopicArray[indexPath.row].id!) {
        cell.topicCompletedTickImageView.image = #imageLiteral(resourceName: "Tick")
    }

Наконец вызов внутри ViewWillAppear, потому что это происходит из topicDetailV C назад

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
    retrieveIdFromCoreData()
}

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

output

...