首页 > 解决方案 > Swift - 让 TableViewControllers 相互交谈

问题描述

我正在开发一个基于日期的应用程序。我正在尝试获取从一个 TableViewController 传递到另一个的信息。

这是一个基于通知的应用程序,可以提醒用户今天有事情发生。所以在它发布之日,我希望它从发布列表中移除并进入发布列表(因此,如果 11 月 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
    }
}

标签: swiftuitableviewcore-dataviewcontroller

解决方案


推荐阅读