当我用view B
解雇self.dismiss(animated: true, completion: nil)
时,没有叫view A
的numberOfRowsInSection
和cellForRowAt
,viewDidLoad
也没有。
这是我的代码,我是UITableView
的新手,所以请原谅任何愚蠢的错误。
class WalletTableViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var addCryptoButton: UIButton!
var cryptosArray: [Cryptos] = []
override func viewDidLoad() {
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.none
tableView.delegate = self
loadCryptoArray()
print("viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
tableView.delegate = self
loadCryptoArray()
print("viewWillAppear")
}
func loadCryptoArray() {
print("loadCryptoArray")
if UserDefaults.standard.object(forKey: "cryptosArray") != nil {
if let decoded = UserDefaults.standard.object(forKey: "cryptosArray") as? Data? {
let decodedCryptoArray = NSKeyedUnarchiver.unarchiveObject(with: decoded!) as! [Cryptos]
cryptosArray = decodedCryptoArray
}
} else {
print("UserDefaults KO")
}
}
@IBAction func addCryptoButtonTapped(_ sender: Any) {
let cryptoPickerViewController = self.storyboard?.instantiateViewController(withIdentifier: "cryptoPickerViewController")
self.present(cryptoPickerViewController!, animated: true)
}
@IBAction func segmentedControlTapped(_ sender: Any) {
switch segmentedControl.selectedSegmentIndex
{
case 0:
self.dismiss(animated: true, completion: nil)
case 1:
self.dismiss(animated: true, completion: nil)
default:
break
}
}
}
//-----------------------------
extension WalletTableViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cryptosArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let crypto = cryptosArray[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! WalletTableViewCell
cell.setCrypto(crypto: crypto)
cell.delegate = self
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 85
}
}
viewDidLoad
在viewController
的生命周期中被召唤一次。因此,假设A
呈现B
,那么当B
被解雇时,没有理由再次调用viewDidLoad
,因为A
已经从之前加载并且只是在屏幕上显示。
要从呈现的B
回来时重新加载表,只需将其添加到A
:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
只要viewWillAppear
出现在屏幕上,就会调用viewController
回调。当从B
回来时就是这种情况 - A
被隐藏了,现在又重新出现了。在docs中阅读更多内容,特别是处理与视图相关的通知部分:
使用像
viewWillAppear(_:)
这样的方法来准备你的视图出现在屏幕上......