单击UITableView时没有任何反应(尝试在视图之间发送数据)

时间:2018-11-16 17:29:44

标签: swift uitableview core-data

所以我有一个两页应用程序。该应用程序作为用户的目的可以存储费用。他们记录selection = ['cat', 'dog'] df = pd.DataFrame({'molecule': ['a','b','c','d','e'], 'species' : [['dog'], ['horse','pig'],['cat', 'dog'], ['cat','horse','pig'], ['chicken','pig']]}) name(属性),并且此数据存储在amount(实体)中。我已经弄清楚了如何创建核心数据值,删除和检索。我现在正在更新。这将通过用户在存储费用的第一个视图(Expenses)中的表上轻按来实现,并将其带到第二个视图(ExpensesViewController)中,在此它们可以将值更新回核心数据。我被这些视图之间的“数据传输”所困扰。

我正在使用情节提要,并通过“显示”将第一个视图连接到第二个视图,并将segue标识符设置为“ editExpense”。但是,点击表行时不会发生任何事情。知道为什么它不起作用以及我可能错过了什么吗? See here for GIF

Picture of the segue

Outlet connections

ExpensesViewController

EditExpensesViewController

EditExpensesViewController

import UIKit
import CoreData

class ExpensesViewController: UIViewController {

    @IBOutlet weak var totalLabel: UILabel!
    @IBOutlet weak var tableView: UITableView!

    var expenses_array = [Expenses]()
    var send_array = [Expenses]()

    override func viewDidLoad(){
        super.viewDidLoad()
        retrieveExpenses()
    }

    func retrieveExpenses(){
        let fetchRequest: NSFetchRequest<Expenses> = Expenses.fetchRequest()
        do {
            let expenses = try PersistenceService.context.fetch(fetchRequest)
            self.expenses_array = expenses
            self.tableView.reloadData()

        } catch  {
            print(error.localizedDescription )
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "editExpense") {
            let secondViewController = segue.destination as! EditExpensesViewController
            secondViewController.send_array = send_array
        }
    }


}

extension ExpensesViewController: UITableViewDataSource {

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

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .value1, reuseIdentifier: nil)
        cell.textLabel?.text = expenses_array[indexPath.row].name
        cell.detailTextLabel?.text = expenses_array[indexPath.row].amount
        return cell
    }

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

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if (editingStyle == .delete) {

            let fetchRequest: NSFetchRequest<Expenses> = Expenses.fetchRequest()
            do {
                let result = try PersistenceService.context.fetch(fetchRequest)

                // Delete from Core Data and remove from the arrays then save
                if result.contains(expenses_array[indexPath.row]){
                    PersistenceService.context.delete(expenses_array[indexPath.row])
                    expenses_array = expenses_array.filter { $0 != expenses_array[indexPath.row] }
                    PersistenceService.saveContext()
                    self.getTotalExpenses()
                    self.tableView.reloadData()
                }

            } catch  {
                print(error.localizedDescription )
            }
        }
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        send_array = [self.expenses_array[indexPath.row]]
        self.performSegue(withIdentifier: "editExpense", sender: self)
    }

}

2 个答案:

答案 0 :(得分:1)

首先符合viewDidLoad()中的tableView委托和dataSource:

tableView.delegate = self
tableView.dataSource = self

从stroyboard删除segue,我们将使用以下代码呈现控制器:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "editExpense") {
        let secondViewController = segue.destination as! EditExpensesViewController
        secondViewController.send_array = send_array
        // "someIdentifier" is the identifier of secondController in storyboard
         storyboard?.instantiateViewController(withIdentifier: "someIdentifier")
        present(secondViewController, animated: true, completion: nil)
    }
}

请注意使用属性检查器将第二个控制器的情节提要标识符放入情节提要中

答案 1 :(得分:0)

问题是您的第一个视图控制器仅是UITableViewDataSource。这还不够。它也必须是UITableViewDelegate。 didSelectRowAt是一个委托方法,而不是数据源方法,除非此视图控制器是表视图委托并且被明确声明为符合UITableViewDelegate,否则将不会被调用。