詳細ビューで値が変更された場合、基本的に以前のビュー(FirstViewController
)のコンテンツを更新したいとします。これを行うための1つの方法は、Protocols and Delegates
です。すでにstoryboards
とsegues
について知っているとします。この例では、DetailViewController
のボタンを押すとFirstViewController
のUILabel
のテキストが変更されます。
続きはDetailViewController
で始まります。このシーンの変更を観察し、それに応じて他のシーンのデータを更新したいとします。したがって、このクラスにprotocolを定義する必要があります。
protocol DetailDelegate {
func updateCellWith(_ data:String)
}
このクラスの完全な定義は次のようになります。
import UIKit
protocol DetailDelegate {
func updateCellWith(_ data:String)
}
class DetailViewController: UIViewController {
var delegate: DetailDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
//On button tap the cell content will change in the previous scene through the delegate method
@IBAction func didTapBtn(_ sender: AnyObject) {
delegate?.updateCellWith("Cell updated")
}
}
FirstViewController
はDetailViewController
のdelegate
なり、DetailDelegate
に準拠します。移行前にをDetailViewController
の代理人に設定します。オンボタン
class FirstViewController: UIViewController, DetailDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
// Mark Navigation
@IBAction func moveToDetailVC(_ sender: AnyObject) {
performSegue(withIdentifier: "detail", sender: indexPath)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let vc = segue.destination as! DetailViewController
vc.delegate = self
}
}
DetailViewController
は、デリゲートメソッドupdateCellWith:
を通じてFirstViewController
に文字列Cell updated
を渡しますタップします。
iOSで 'UITableViewCells'とデータの永続性を再利用して、' UITablevIews'についてどれくらい知っていますか? – Adeel
@Adeelよく私は細胞を再利用することについて知っています(私はその技術を利用しています)。データの永続性については、SQLiteを使用しています。しかし、この場合、私はビュー間のデータの永続化について心配しています。私は知識がないので、2番目の質問「ユーザーが詳細ビューから戻ってそのセルを更新したらどうすればいいですか? – eestein
詳細ビューから戻るときにセルを更新するには、2通りの方法があります。 1)「プロトコル」2)「通知」。私はあなたが最初の選択肢に行くことをお勧めします。あなたはどの言語を使っていますか? – Adeel