はじめに
こちらの記事を参考に、MapViewとCustomViewを作成したのですが、そこから「CustomViewをタップしたら画面遷移」したくなったのでやってみました。
参考記事に記載されているCustomView
はUIView
なので、画面遷移処理をかけません。
PlaceCalloutView.swift
import UIKit
final class PlaceCalloutView: UIView {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var imageView: UIImageView!
@IBAction func buttonDidTap(_ sender: Any) {
print("button was tapped")
}
}
さて、どうしたもんか。
実装
対応策としてはDelegate
を使って「UIView
にできないことはUIViewController
に任せちゃおう」ということにしました。
PlaceCalloutView.swift
import UIKit
final class PlaceCalloutView: UIView {
@IBOutlet weak var title: UILabel!
@IBOutlet weak var viewButton: UIButton!
var delegate: PlaceCalloutViewDelegate? = nil
@IBAction func tepedViewButton(_ sender: Any) {
self.delegate?.showNextView()
}
}
protocol PlaceCalloutViewDelegate {
func showNextView()
}
TopViewController.swift
import UIKit
class TopViewController: UIViewController {
// 省略
}
extension TopViewController: PlaceCalloutViewDelegate {
func showNextView() {
// 画面遷移処理
let storyboard = UIStoryboard(name: "NextView", bundle: nil)
let nextVC = storyboard.instantiateViewController(withIdentifier: "NextView") as! NextViewController
self.present(congestionGraphVC, animated: false)
}
}
まとめ
Delegate
の使い方としてより良い使い方等ありましたら、ご指摘願います。