前提・実現したいこと
delegateを使って下記の処理を実現したいです。
「Top画面」という画面の上に、containerViewを配置し、
containerViewの上にViewを配置しています。
Top画面に対して、クラス:ViewControllerを割り当てています。
Top画面の配下のViewの、さらに配下のCotainerAに、
下記の「冷蔵庫画面」を配置していて、クラス:cabinViewControllerを設定しています。
※delegateについての私の理解(間違いありましたらご指摘ください)
delegateとは、自分のクラスの処理内容を他のクラスに実行してもらう(移譲する)こと。
下記の実装が必要。
①protcolの定義
②protcolに準拠した、処理内容を記載するクラス(今回やりたいことだとviewControllerB)
③処理の移譲先を指定するクラス(今回やりたいことだとviewControllerA)
発生している問題・エラーメッセージ
下記のとおりコードを記載しているのですが、myTableView.reloaDate()の処理で、
myaTableViewの値がnilになってしまうエラーが発生してしまい、解決方法がわかりません。
該当のソースコード
①protocol
swift
1protocol ReloadDataDelegate { 2 func reloadTabeleDate() 3} 4
②CabinviewController(冷蔵庫画面)
swift
1class CabinViewController:UIViewController, UITableViewDelegate, UITableViewDataSource, UINavigationControllerDelegate,ReloadDataDelegate { 2 3 @IBOutlet weak var myTableView: UITableView! 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 myTableView.delegate = self 8 myTableView.dataSource = self 9 } 10 11 //MARK:- デリゲート 12 func reloadTabeleDate(){ 13 print("test") 14 myTableView.reloadData() 15 } 16}
③ViewController(TOP画面)
swift
1class ViewController: UIViewController, UINavigationControllerDelegate { 2 3 var delegate:ReloadDataDelegate! 4 5 // MARK: - ContainerView 6 var containers:Array<UIView>=[] 7 @IBOutlet weak var containerA: UIView! 8 @IBOutlet weak var containerB: UIView! 9 @IBOutlet weak var containerC: UIView! 10 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 let cabinVC = CabinViewController() 16 self.delegate = cabinVC 17 18 containers=[containerA,containerB,containerC] 19 containerView.bringSubviewToFront(containers[containerIndex]) 20} 21 22~(中略)~ 23 //MARK:- segmentBarの値に応じて、containerViewの表示を切り替え 24 @IBAction func SegmentAction(_ sender: UISegmentedControl) { 25 26 let currentContainerView=containers[sender.selectedSegmentIndex] 27 containerView.bringSubviewToFront(currentContainerView) 28 } 29 30~(中略)~ 31 //NavigationBarのボタン 32 @IBAction func templateButton(_ sender: Any) { 33 reload() 34} 35 36 func reload() { 37 self.delegate?.reloadTabeleDate() 38 } 39} 40
試したこと
実行すると、reloadTabeleDate()内の、"test"の出力がされることは確認しています。
補足情報(FW/ツールのバージョンなど)
Swift 5.X