Обновление TableView из другого ViewController с помощью segues

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

У меня есть ViewController с TableView и другой ViewController, который содержит данные, которые я пытаюсь передать в TableView. Для добавления записей в TableView я использовал segues, но проблема с segues заключается в том, что они не обновляют TableView постоянно. Они просто создают экземпляр ViewController и добавляют туда запись, но исходный объект остается неизменным. Оба ViewControllers являются частью контроллера панели вкладок. Я хочу постоянно обновлять таблицу. Это означает, что я хочу иметь возможность перейти к ViewController, где определена таблица, и увидеть, что добавлена запись. Вот код для ViewController с TableView:

 import UIKit

class FavoritesViewController: UIViewController {
    
    public var shops = [
        "hello world",
        "hello world",
        "hello world"
    ]
    
    @IBOutlet weak var table: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        table.delegate = self
        table.dataSource = self
        table.reloadData()
    }
    
}



extension FavoritesViewController: UITableViewDelegate, UITableViewDataSource{
    
    func add(_ shopName: String) {
        print(shopName)
        shops.append(shopName)
    }
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return shops.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)
        cell.textLabel?.text = shops[indexPath.row]
        return cell
        
    }
    
    // define the action. In this case "delete"
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
        return .delete
    }
    
    // do the actual deleting
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        
        if editingStyle == .delete {
            tableView.beginUpdates()
            
            shops.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
            
            tableView.endUpdates()
        }
        

    }
    
    
}
 

И вот как я пытаюсь обновить (в случае добавления записи) TableView в другом ViewController:

 class MainViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate{

public var shopName:String?

// there are also many other vars, but they're irrelevant

public var favoritesDestinationVC = FavoritesViewController()


// prepares the data for the segue 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
      
        if segue.identifier == "goToFavs" {
            favoritesDestinationVC = segue.destination as! FavoritesViewController
            if let newShopName = shopName {
                favoritesDestinationVC.shops.append(newShopName)
            }
            
            
        }
    }



} 
 

Однако, когда я добавляю запись в таблицу, segue создает экземпляр FavoritesViewController , добавляет туда эту запись, а затем отображает ее во всплывающем окне, подобном этому:
введите описание изображения здесь

Но когда я закрываю это окно, изменения исчезают (TableView остается прежним; 3 раза «Привет, мир»).

Я хочу, чтобы изменения были сохранены в TableView после закрытия этого окна. Есть идеи, как это сделать? О том, как сделать эти изменения постоянными?

Ответ №1:

По вашему объяснению, это выглядит так. Segue определяется как представление FavoritesViewController модально. и такое поведение ожидается. По вашей реализации. Поскольку вы не обновляете объект view controller, который является частью контроллера панели вкладок.

Чтобы внести изменения в контроллер в контроллере панели вкладок, либо вы получаете доступ к этому объекту с помощью tabcontroller.viewcontrollers. Общайтесь другим способом, например, с помощью делегата или уведомления.

Редактировать: это полностью зависит от того, к чему вы хотите получить доступ FavoritesViewController .

Если вы хотите получить доступ из TabBarViewController (в зависимости от вашей иерархии представлений, это может измениться. будьте осторожны с индексами и приведением типов):

 let favVC = self.viewControllers?[1] as! FavoritesViewController
favVC.shops.append(newShopName)
 

Если вы хотите получить доступ из контроллера представления, который является частью того же контроллера панели вкладок:

 var favVC = self.tabBarController?.viewControllers?[1] as! FavoritesViewController 
favVC.shops.append(newShopName)
 

Примечание: индекс Viewcontrollers зависит от порядка viewcontroller в вашем контроллере панели вкладок. И приведение типов зависит от вашей иерархии представлений.

Комментарии:

1. Спасибо за ответ! Но как бы я это сделал в моем случае? Я все еще новичок, и я немного смущен этим. Как это будет выглядеть в коде? описания необходимых шагов достаточно. Я разберусь с остальным. Заранее спасибо.

2. Отредактировал ответ с более подробной информацией.