画面遷移時に、そのクラスで取得した値を遷移先画面のクラスに渡す方法
実現したいこと
あるクラスでの処理で取得した値を画面遷移に伴って、遷移先画面のクラスに渡してその値をそのまま使いたい。どのような時にその動作が必要だったかというと、tableViewのタップ時である。
tableViewのセルに配置されているUIButtonを押すことによって、どのtableViewのUIButtonが押されたのかがわかるようにInt型の値を取得し、その値を次のクラスに渡す。そしてそのクラス内では、渡された値を参照してタップされたセルの情報を画面上に表示するというものだ。
実装方法
前提として、この一連の動作を実装するためには、遷移先クラス内で変数を用意する必要がある。その変数には任意の数字を入れ、定義しておく。
また、遷移元クラスをViewController
、遷移先クラスをNextViewContoller
とする。
手順としては、
① 遷移先クラスで変数を定義する。
var testNumber: Int = 1
②遷移元クラス内で遷移先クラスをインスタンス化し、そのインスタンス化したクラスのtestNumber
プロパティに渡したい値を代入する。(今回は、別クラスのUIButtonが押下された際に、押下されたUIbuttonのセル番号をDelegateで遷移元クラスに通知し、遷移先クラスに渡す値としてtestNumber
に代入する。)
その後、遷移先画面に遷移するためのコードを記述する。
extension ViewController: ToNextViewControllerProtocol {
func transition(_sender: UIButton) {
let viewController = self
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let nextViewController =
storyboard.instantiateViewController(identifier:
"NextViewController") as!
NextViewController
nextViewController.testNumber = _sender.tag
DispatchQueue.main.async {
viewController.navigationController?.pushViewController(nextViewController, animated: true)
}
}
}
これでオッケーだ。以上のコードにより、あるViewクラスで取得した値を別のViewクラスに渡してその値を画面遷移に伴って使用することができる。
追記
元々はこの動作を、Delegateを使用して実装しようとしていた。プロトコルを定義し、tableViewのカスタムセルクラス内でdelegateを宣言する。その後、tableViewを表示するクラスで通知され、値を受け取る。最後に、タップされたセルに該当する情報を表示するクラスにもそれを通知させ、そこでも同じ値を受け取る。
しかし、この方法はうまくいかなかった。いろいろ調べてみると、Delegateは通常1箇所しか通知をしないということがわかった。Delegateに複数クラスに対して通知させるには、Publisher
という「複数のDelegateを受け取るオブジェクトであるSubscriberを登録する機能」を使用すればよいらしい。
Publisherに関してはまたの機会に勉強して、また記事を残したいと思う。
Discussion