При нажатии UITableView ничего не происходит (при попытке отправки данных между представлениями) - PullRequest
0 голосов
/ 16 ноября 2018

Итак, у меня есть приложение на две страницы.Цель приложения, являющегося пользователем, может хранить расходы.Они регистрируют name и amount (атрибуты), и эти данные хранятся в Expenses (объект).Я выяснил, как создавать значения основных данных, удалять и извлекать.Я сейчас работаю над обновлением.Это будет работать, когда пользователь нажимает на таблицу в первом представлении (ExpensesViewController), где хранятся расходы, и переносит их во 2-е представление (EditExpensesViewController), где они могут обновить значение обратно в базовые данные.Я застрял в этой «передаче данных» между представлениями.

Я использую раскадровку и соединил первый вид со вторым через 'show', установив идентификатор segue как 'editExpense'.Однако ничего не происходит, когда строка таблицы коснулась.Любая идея, почему это не работает и что я, возможно, пропустил? См. Здесь для GIF

Picture of the segue

Outlet connections

ExpensesViewController

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

}

EditExpensesViewController

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 ]

0 голосов
/ 16 ноября 2018

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

0 голосов
/ 16 ноября 2018

Прежде всего, соответствуют делегатам tableView и источнику данных в вашем viewDidLoad ():

tableView.delegate = self
tableView.dataSource = self

Удалите segue из stroyboard, и мы представим контроллер в коде, используя:

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

Помните, что нужно добавить идентификатор раскадровки для второго контроллера в раскадровку с помощью инспектора атрибутов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...