質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

2回答

1299閲覧

Swiftにて別のクラスからtableViewのcellを追加したい

yy.yy

総合スコア6

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/07/31 15:03

前提・実現したいこと

tableViewを使った入力フォームを作っています。
入力フォームを追加するためのボタンが入ったカスタムセルが常に一番下にあります。
その一番下にあるボタンを押した時にMain内のtableViewを更新したいのですが以下のようなエラーが出てうまくいきません。

発生している問題・エラーメッセージ

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

該当のソースコード

Swift

1class Main:UIViewController, UITableViewDelegate, UITableViewDataSource { 2 @IBOutlet weak var tableView: UITableView! 3: 4: 5 //セル追加時の処理 6 func tableReLoad() { 7 tableView.beginUpdates() 8 tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .automatic) 9 tableView.endUpdates() 10 } 11}

Swift

1//カスタムセル 2class Custom: UITableViewCell{ 3 @IBOutlet weak var button: UIButton! 4 let Ins = Main() 5 6 //ここでボタンが押された時にMainのtableViewのcell追加の処理をしたい 7 @IBAction func button(_ sender: Any) { 8 Ins.tableReLoad() 9 } 10}

試したこと

Main内にボタンを作り下記のように試したところカスタムセルのボタンの方はやはりエラーが出るのですが、Main内のボタンの方はエラーなく入力フォームが追加されました。
しかし、セル内に追加ボタンをどうしても表示したいので上記の方法でエラーが出ない方法が知りたいです。

Swift

1class Main:UIViewController, UITableViewDelegate, UITableViewDataSource { 2 @IBOutlet weak var tableView: UITableView! 3 @IBOutlet weak var newButton: UIButton! 4: 5: 6 //エラーが出る 7 func tableReLoad() { 8 tableView.beginUpdates() 9 tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .automatic) 10 tableView.endUpdates() 11 } 12 13 //エラーが出ない 14 @IBAction func newButton(_ sender: Any) { 15 tableView.beginUpdates() 16 tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .automatic) 17 tableView.endUpdates() 18 } 19}

Swift初心者でわからないことも多く説明不足な点もあるかもしれませんが、ご教示いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

いろいろやり方はあるでしょうが、

swift

1class Custom: UITableViewCell{ 2 @IBOutlet weak var button: UIButton! 3 weak var main: Main! 4 5 @IBAction func button(_ sender: Any) { 6 main.tableReLoad() 7 } 8}

とでもしてCustomをMainクラス内で構築する際に

swift

1custom.main = self

などと参照を渡してください。
とりあえず動くか試して、何故これで動くのか理解できない箇所があれば調べてください。
それでもわからなければまた聞いてください。

投稿2019/08/01 01:43

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yy.yy

2019/08/01 02:40

回答ありがとうございます。 この方法で一度試してみます。
guest

0

swift

1let Ins = Main()

これは新規に生成したMainのインスタンスであり、遷移元のMainではありません。
遷移元のMainに対してセルの追加などを行って下さい。

投稿2019/07/31 23:37

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yy.yy

2019/08/01 00:41

回答ありがとうございます。 申し訳ないのですが自分の力量不足で理解に至らないので、詳しく教えていただけないでしょうか?
fuzzball

2019/08/01 00:44

どこが理解できないのか分からないので。 あと、分からないことはまず自分で調べて下さい。
yy.yy

2019/08/01 01:39

すみません、考えてみます。
fuzzball

2019/08/01 01:47

どこが理解できないのかは教えてもらえないのでしょうか?
yy.yy

2019/08/01 02:39

let Ins = Main()がこの場合ではどのような働きをしているのかがわからないです。
fuzzball

2019/08/01 02:46

働きというのは何でしょうか? 回答にも書きましたが、Mainのインスタンスを生成しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問