首页 > 解决方案 > 根据在 TableView 中选择的单元格更改字典中的值

问题描述

故事板

当单击 tableView 中的单元格时,单元格数据(从数组中获取)被传递到“详细视图控制器”以显示在标签中。在 Detailview 上按下编辑时,数据将传递到“编辑视图控制器”文本字段。

在编辑这些文本字段并按“保存”时,我希望这些数据根据在 tableView 中按下的单元格覆盖数组字典中的当前数据。

最好的方法是什么?现在数据一直传递到“EditViewController”,但在保存时不会返回到数组中的相应字典。

主视图控制器:

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // Set up Delegate and Data Source for Table View

    @IBOutlet weak var tradeTableView: UITableView!
    
    var tradesList = TradeList()
    
    // Go to detail view of trade when pressing its tableview cell
    @IBSegueAction func showDetailView(_ coder: NSCoder) -> DetailViewController? {
        guard let indexPath = tradeTableView.indexPathForSelectedRow
        else { fatalError("Nothing selected!")}
        
        let trade = tradesList.trades[indexPath.row]
        
        return DetailViewController(coder: coder, trade: trade)
        
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the table view as the delegate and data source
        tradeTableView.dataSource = self
        tradeTableView.delegate = self
        
    }
    
    // Delegating functions for Table View
    func numberOfSections(in tableView: UITableView) -> Int {
        1
    }
    
    // Delegating functions for Table View
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        tradesList.trades.count
    }
    
    // Delegating functions for Table View
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "\(TradeCell.self)", for: indexPath) as? TradeCell
        else { fatalError("Could not create TradeCell")}
        
        let trade = tradesList.trades[indexPath.row]
        
        // Text to display in cells 'ticker' and 'name' label
        cell.tickerLabel?.text = trade.ticker
        cell.nameLabel?.text = trade.name
    
        return cell
    }
}

细节视图控制器:

    class DetailViewController: UIViewController {
    
    let trade: Trade
    
    @IBOutlet var tickerLabel: UILabel!
    @IBOutlet var nameLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Changes labels according to which cell was pressed in ViewController
        tickerLabel.text = trade.ticker
        nameLabel.text = trade.name
    }
    
    // Initializers
    required init?(coder: NSCoder) { fatalError("This should never be called!")}
    
    required init?(coder: NSCoder, trade: Trade) {
        self.trade = trade
        super.init(coder: coder)
        
    }
    
    // Edit button tapped
    @IBAction func editTapped(_ sender: Any) {
        self.performSegue(withIdentifier: "DetailVCToEditVC", sender: self)
    }
    
    // Prepare data to pass to 'EditViewController'
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        if(segue.identifier == "DetailVCToEditVC"){
            let displayVC = segue.destination as! EditViewController
            displayVC.editTitle = tickerLabel.text
            displayVC.editPrice = nameLabel.text
        }
    }
}

编辑视图控制器:

class EditViewController: UIViewController {

// Variables recieving passed data from 'DetailViewController'
var editTitle: String?
var editPrice: String?

@IBOutlet weak var editTitleField: UITextField!
@IBOutlet weak var editPriceField: UITextField!


override func viewDidLoad() {
    super.viewDidLoad()
    // Setting the textfields text according to the passed data from 'DetailViewController'.
    editTitleField.text = editTitle
    editPriceField.text = editPrice
}

@IBAction func editSaveButton(_ sender: UIButton) {
    
    // Dismisses edit screen overlay
    self.dismiss(animated: true, completion: nil);
    
    }
}

我的数组在另一个 swift 文件中如下所示:

struct TradeList {
    
let trades: [Trade] = [
    Trade(ticker: "AAPL", name: "Apple"),
    Trade(ticker: "AMD", name: "Advanced Micro Devices")
]

}

标签: arraysswiftxcodeuitableviewmodel-view-controller

解决方案


使用单例模式更新数据。您不需要将数据传递给视图控制器。它会自动更新。这是您的交易清单结构应该如何

struct TradeList {
static let shared = TradeList(trades: [
    Trade(ticker: "AAPL", name: "Apple"),
    Trade(ticker: "AMD", name: "Advanced Micro Devices")
])

var trades: [Trade] = []

}

你可以在任何地方使用它

用于获取值

print(TradeList.shared.trades)

用于更新值

TradeList.shared.trades = [...]//Any value here

推荐阅读