Swift - Получение информации от одного TableViewController к другому - PullRequest
0 голосов
/ 24 ноября 2018

Я работаю над приложением, основанным на дате.Я пытаюсь передать информацию от одного UITableViewController к другому.

Это приложение на основе уведомлений, которое напоминает пользователю о том, что что-то выходит сегодня.Поэтому, когда он выйдет, я бы хотел, чтобы он вышел из списка релизов и вошел в список релизов (поэтому, если что-то выйдет 8 ноября, в этот день он будет перемещен в список релизов).

У меня проблемы с тем, чтобы заставить его работать.Я использовал приведенные ниже коды, и дата приходит и уходит, но ничего не происходит, она все еще отображается в списке релизов.

Я пробовал несколько вариантов и разных вариантов кода, но, похоже, ничего не работает.

У меня есть этот код в файле AppDelegate.Swift, поэтому он обновляет информацию:

 func applicationDidBecomeActive(_ application: UIApplication) { 

Ниже приведен код, который я использовал в списке релизов:

let startOfToday = Calendar.current.startOfDay(for: Date()) as NSDate
let predicate = NSPredicate(format: "release_date > %@", startOfToday)
fetchRequest.predicate = predicate 

Ивот код из вышедшего списка:

let startOfToday = Calendar.current.startOfDay(for: Date()) as NSDate
let predicate = NSPredicate(format: "release_date < %@", startOfToday)
fetchRequest.predicate = predicate

Вот код для FreshReleaseTableViewController:

import UIKit
import CoreData
import UserNotifications

class FreshReleaseTableViewController: UITableViewController{
    var freshreleases = [Release_Date]()
    let dateFormatter = DateFormatter()

    override func viewDidLoad() {
        super.viewDidLoad()

        //create a new button
        let button = UIButton.init(type: .custom)
        //set image for button
        button.setImage(UIImage(named: "Mic App Logo.png"), for: UIControlState.normal)

        dateFormatter.dateStyle = .full
        dateFormatter.timeStyle = .none
    }

    @objc func editAction() {
        let viewController = AddfreshreleaseViewController()
        navigationController?.present(viewController, animated: true, completion: nil)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext

        let fetchRequest = Release_Date.fetchRequest() as NSFetchRequest<Release_Date>

        let sortDescriptor1 = NSSortDescriptor(key: "artist", ascending: true)
        let sortDescriptor2 = NSSortDescriptor(key: "album", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor1, sortDescriptor2]
        do {
            freshreleases = try context.fetch(fetchRequest)
        } catch let error {
            print("Could not fetch because of error: \(error).")
        }

        let startOfToday = Calendar.current.startOfDay(for: Date()) as NSDate
        let predicate = NSPredicate(format: "release_date > %@", startOfToday)
        fetchRequest.predicate = predicate

        tableView.reloadData()
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return freshreleases.count
    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "FreshReleaseCellIdentifier", for: indexPath)

        let freshrelease = freshreleases[indexPath.row]

            cell.textLabel?.numberOfLines = 0

        let artist = freshrelease.artist ?? ""
        let album = freshrelease.album ?? ""
        cell.textLabel?.text = artist + "'s\nnew album '" + album + "'\nreleases"

        if let date = freshrelease.release_date as Date? {
            cell.detailTextLabel?.text = dateFormatter.string(from: date)
        } else {
            cell.detailTextLabel?.text = ""
        }

        return cell
    }

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    // Override to support editing the table view.
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if freshreleases.count > indexPath.row {
            let freshrelease = freshreleases[indexPath.row]

            // Remove notification
            if let identifier = freshrelease.release_dateId {
                let center = UNUserNotificationCenter.current()
                center.removePendingNotificationRequests(withIdentifiers: [identifier])
            }

            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            let context = appDelegate.persistentContainer.viewContext
            context.delete(freshrelease)
            freshreleases.remove(at: indexPath.row)
            do {
                try context.save()
            } catch let error {
                print("Could not save \(error)")
            }
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }

    @available(iOS 11.0, *)

    override func tableView(_ tableView: UITableView,
                   leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

    {
        let modifyAction = UIContextualAction(style: .normal, title:  "Edit", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            let MainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
            let vc : UIViewController = MainStoryboard.instantiateViewController(withIdentifier: "FreshReleaseEdit") as UIViewController
            self.present(vc, animated: true, completion: nil)
            success(true)

        })
        modifyAction.title = "Edit"
        modifyAction.backgroundColor = .blue

        return UISwipeActionsConfiguration(actions: [modifyAction])
    }

    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }
}

А вот код для ReleasedTableViewController:

import UIKit
import CoreData
import UserNotifications

class ReleasedTableViewController: UITableViewController{
    var freshreleases = [Release_Date]()
    let dateFormatter = DateFormatter()

    override func viewDidLoad() {
        super.viewDidLoad()

        //create a new button
        let button = UIButton.init(type: .custom)
        //set image for button
        button.setImage(UIImage(named: "Mic App Logo.png"), for: UIControlState.normal)

        dateFormatter.dateStyle = .full
        dateFormatter.timeStyle = .none
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext

        let fetchRequest = Release_Date.fetchRequest() as NSFetchRequest<Release_Date>

        let sortDescriptor1 = NSSortDescriptor(key: "album", ascending: true)
        let sortDescriptor2 = NSSortDescriptor(key: "artist", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor1, sortDescriptor2]
        do {
            freshreleases = try context.fetch(fetchRequest)
        } catch let error {
            print("Could not fetch because of error: \(error).")
        }

        let startOfToday = Calendar.current.startOfDay(for: Date()) as NSDate
        let predicate = NSPredicate(format: "release_date < %@", startOfToday)
        fetchRequest.predicate = predicate

        tableView.reloadData()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return freshreleases.count
    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "FreshReleaseCellIdentifier", for: indexPath)

        let freshrelease = freshreleases[indexPath.row]

        cell.textLabel?.numberOfLines = 0

        let artist = freshrelease.artist ?? ""
        let album = freshrelease.album ?? ""
        cell.textLabel?.text = artist + "'s \nnew album '" + album + "'\nreleases"

        if let date = freshrelease.release_date as Date? {
            cell.detailTextLabel?.text = dateFormatter.string(from: date)
        } else {
            cell.detailTextLabel?.text = ""
        }

        return cell
    }

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if freshreleases.count > indexPath.row {
            let freshrelease = freshreleases[indexPath.row]

            // Remove notification
            if let identifier = freshrelease.release_dateId {
                let center = UNUserNotificationCenter.current()
                center.removePendingNotificationRequests(withIdentifiers: [identifier])
            }

            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            let context = appDelegate.persistentContainer.viewContext
            context.delete(freshrelease)
            freshreleases.remove(at: indexPath.row)
            do {
                try context.save()
            } catch let error {
                print("Could not save \(error)")
            }
            tableView.deleteRows(at: [indexPath], with: .fade)

        }
    }

    @available(iOS 11.0, *)
    override func tableView(_ tableView: UITableView,
                            leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

    {
        let modifyAction = UIContextualAction(style: .normal, title:  "Update", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        modifyAction.title = "Edit"
        modifyAction.backgroundColor = .blue

        return UISwipeActionsConfiguration(actions: [modifyAction])
    }

    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }
}
...