arrays - 根据在 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")
]
}
解决方案
使用单例模式更新数据。您不需要将数据传递给视图控制器。它会自动更新。这是您的交易清单结构应该如何
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
推荐阅读
- android - 如何在 Android 上获取 Instagram json 数据?
- django - HTTP 403 即使我已登录
- python - PyInstaller 的 .exe 文件在打开后立即关闭
- c++ - opencv 项目程序不会停止
- node.js - 如何使用 Phusion Passanger 为 Nodejs 和 Express 应用程序提供服务
- python - 在 Python 中具有不同参数列表的超类的构造函数调用
- javascript - 在谷歌日历 API 中将凭证或令牌从 JS 传递到 PHP
- javascript - 如何在 JS 中废弃 RSS 链接
- java - JSP 搜索选项
- java - 爪哇 | 自定义创建的包不存在