【问题标题】:Updating tableView from another ViewController using segues使用 segues 从另一个 ViewController 更新 tableView
【发布时间】:2020-12-27 17:58:32
【问题描述】:

我有一个带有 tableView 的 viewController,另一个 viewController 包含我试图传递给 tableView 的数据。为了向 tableView 添加条目,我使用了 segues,但 segues 的问题是它们不会永久更新 tableView。他们只是创建 ViewController 的一个实例并在那里添加条目,但原始对象保持不变。两个 ViewController 都是标签栏控制器的一部分。我想要的是永久更新表格。意思是,我希望能够导航到定义表的 viewController 并查看已添加的条目。这是带有 tableView 的 viewController 的代码:

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

    }
    
    
}

这就是我尝试更新(在添加条目的情况下)另一个 viewController 中的 tableView 的方式:

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 次“Hello World”)。

我希望在关闭此窗口后将更改保存在 tableView 中。关于如何做到这一点的任何想法?关于如何使这些更改永久化?

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

    根据您的解释,它看起来像。 Segue 被定义为以模态方式呈现FavoritesViewController。并且这种行为是预期的。通过您的实施。由于您没有更新作为选项卡栏控制器一部分的视图控制器对象。

    要在标签栏控制器中对控制器进行更改,您可以使用 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)
    

    注意:视图控制器的索引取决于标签栏控制器中视图控制器的顺序。类型转换取决于您的视图层次结构。

    【讨论】:

    • 感谢您的回答!但在我的情况下,我将如何去做呢?我仍然是初学者,对此我有些困惑。这在代码中会是什么样子?描述所需的步骤就足够了。我会弄清楚其余的。提前致谢。
    • 更详细地编辑了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2022-09-25
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多