はじめまして。業務経験2ヶ月ほどのエンジニアです。
業務でswiftを使用するため、勉強をしており、以下のことを解決できずに数日悩んでおります。
どなたか解決の糸口をご教示いただけますと幸いです。
やりたいこと
ViewController (tableViewを配置している)
ButtonCell (ボタンを2つ配置しているセル)
cellのボタンを押下された場合、tableViewを配置しているviewControllerのメソッドを呼び出し、statusプロパティの更新とtableView.reloadDataをやりたい
問題点
tableViewがnilとなってしまい、tableView.reloadData()が実行できない。
記述したコード(ほとんど省力しています)
■ViewController (tableviewを配置しているクラス)
import UIKit class ViewController: BaseVC ,UITableViewDelegate, UITableViewDataSource { @IBOutlet private weak var tableView: UITableView! var status:Int = 1 override func viewDidLoad() { super.viewDidLoad() } func numberOfSections(in tableView: UITableView) -> Int { // 省略 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 省略 } func didTap() { self.status = 2 tableView.reloadData() } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //省略 (ここでButtonを定義しているcellクラスを呼び出している) } }
■Buttonを定義したCellクラス
import UIKit class ButtonCell: UITableViewCell { @IBOutlet weak var Button1: UIView! @IBOutlet weak var Button2: UIView! override func awakeFromNib() { super.awakeFromNib() } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) } @objc private func change1() { ViewController().didTap() } @objc private func change2() { ViewController().didTap() } }
試したこと
- storyboardのtableViewがViewControllerと接続が切れていないか、確認。
- 以下に記述している内容を参考に、以下のコードを試してみる。
let vc = storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController vc.tableView.reloadData()
次の質問と同じ問題のように見えますね。
Swift:tableViewの値がnilになってしまっている
https://teratail.com/questions/cppwdp3dqz63wt
リンク先の質問ではどこが問題になっているかわからなかったのですが、
質問欄にご記載いただいたように、TableViewCellからTableViewを参照したい場合に起こってしまう問題なのですね。
次のリンクの「OptionButtonsTableViewCell.swift」のような実装イメージになるのでしょうか。
https://stackoverflow.com/questions/20655060/get-button-click-inside-uitableviewcell
コメントいただきありがとうございます。
> 質問欄にご記載いただいたように、TableViewCellからTableViewを参照したい場合に起こってしまう問題なのですね。
おっしゃる通り、TableViewCellからTableViewを参照した場合に、tableView.reloadDataを実行するとtableViewがnilだからできないというエラーが出る問題となっております。
>次のリンクの「OptionButtonsTableViewCell.swift」のような実装イメージになるのでしょうか
はい。やりたいことはこのイメージとなります。こちらと違うのは、ボタンを押下した際に、tableView.reloadDataをするということだけ少し違います。こちらのURLもありがとうございます。確認して、試してみます。
回答1件
あなたの回答
tips
プレビュー