代码之家  ›  专栏  ›  技术社区  ›  Nouman

单击UITableView时不会发生任何情况(尝试在视图之间发送数据)

  •  0
  • Nouman  · 技术社区  · 6 年前

    所以我有一个两页的应用程序。应用程序的目的是用户可以存储费用。他们写了一篇日志 name amount Expenses ExpensesViewController )费用存储在何处,并将其带到第二个视图( EditExpensesViewController )在这里,他们可以将值更新回核心数据。我被困在视图之间的“数据传输”上。

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

    Picture of the segue

    Outlet connections

    费用可视控制器

    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)
        }
    
    }
    

    import UIKit
    import CoreData
    
    class EditExpensesViewController: UIViewController {
    
        var send_array = [Expenses]() // Defined from the previous view controller
    
        override func viewDidLoad() {
            super.viewDidLoad()
            print(send_array)
    
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   andesta.erfan    6 年前

    首先,遵循viewDidLoad()中的tableView委托和数据源:

    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)
        }
    }
    

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

        2
  •  0
  •   matt    6 年前

    问题是您的第一个视图控制器仅是UITableViewDataSource。这还不够。它也需要是UITableViewDelegate。 didSelectRowAt