Передача доступа от tableViewController к другому контроллеру представления - PullRequest
0 голосов
/ 18 июня 2020

Я потратил на это довольно много времени и до сих пор не могу понять, что делаю неправильно.

Я хотел бы запустить функцию reloadData () в своей собственной функции на другой контроллер представления, чем tableViewController, но я получаю ошибку. Тип HomeViewController не имеет члена reloadData.

HomeViewController:

import UIKit
import CoreData

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var index = ""
    var item : [ListItem] = [] //listName
    var listName = [""]

    override func viewDidLoad() {
        super.viewDidLoad()

        self.homeListsTableView.delegate = self
        self.homeListsTableView.dataSource = self
        homeListsTableView.reloadData()

        //List Names

        //List Items - Within a list Name

        let listItem1 = ListItem()
        listItem1.name = "" //Update so names are updated via append the ListItem Array
        listItem1.location = ""
        item.append(listItem1)

        let listItem2 = ListItem()
        listItem2.name = ""
        listItem2.location = ""
        item.append(listItem2)

    }


    @IBOutlet weak var homeListsTableView: UITableView!

    @IBAction func templatesButton(_ sender: Any) {

        tabBarController?.selectedIndex = 2
    }

   override func viewWillAppear(_ animated: Bool) {
             if let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext {
                 if let coreDataListItems = try? context.fetch(ListName.fetchRequest()) as? [ListName] {
                     print(coreDataListItems)
                 }
             }
         }

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

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = listName[indexPath.row]

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // performSegue(withIdentifier: "goToItems", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as! ListNameViewController
        vc.homeListsTableViewVC = homeListsTableView

    }

}

ListName View Controller:

import UIKit
import CoreData

class ListNameViewController: UIViewController, UITableViewDelegate {


   // var listName = [""]
    let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
    var homeListsTableViewVC = HomeViewController.self

    override func viewDidLoad() {
        super.viewDidLoad()

}

@IBOutlet weak var listNameValue: UITextField!
    @IBOutlet weak var locationOption: UITextField!
    @IBOutlet weak var createButtonChange: UIButton!

 @IBAction func createButton(_ sender: Any) {

        let newList = ListName(context: context!)
        newList.listName = listNameValue.text

        // let location = locationOption.text!
        //tabBarController?.selectedIndex = 0
        //performSegue(withIdentifier: "home", sender: nil)

    }

    func saveList() {

          do {
            try context!.save()
          } catch {
            print("Error saving context \(error)")
        }
        homeListsTableViewVC.reloadData()
      }
}

Я пытаюсь использовать функцию подготовки к переходу для передачи данных homeListsTableView, чтобы затем использовать функцию reloadData (). Может кто подскажет, что я делаю не так?

Спасибо!

1 Ответ

0 голосов
/ 18 июня 2020

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

class ListNameViewController: UIViewController, UITableViewDelegate {
    var callback: (()->())?
    //....

    func saveList() {

        do {
          try context!.save()
        } catch {
          print("Error saving context \(error)")
      }
      callback?()
    }
}

И при создании ListNameViewController

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as! ListNameViewController
        vc.callback = {  [weak self] in
            self?.homeListsTableView.reloadData()
        }

    }
}
...