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

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

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

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

Q&A

解決済

1回答

3244閲覧

(Swift)tableviewがnilになってクラッシュしてしまう。

niship

総合スコア37

Swift

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

0グッド

0クリップ

投稿2017/12/26 05:51

いつもお世話になっております。
自作アプリに、ページビュー的なものを実装しようと思っています。
参考サイト
上記サイトを参考に実装してみました。

//MessageViewController.swift override func viewDidLoad() { super.viewDidLoad() let viewController1 = MessageViewController() viewController1.title = "Child View 1" let viewController2 = PipsViewController() viewController2.title = "Child View 2" let viewControllers = [viewController1, viewController2] let option = PageMenuOption(frame: CGRect(x: 0, y: 20, width: self.view.frame.size.width, height: self.view.frame.size.height - 20)) let pageMenu = PageMenuView(viewControllers: viewControllers, option: option) self.view.addSubview(pageMenu) }

上記のコードで実行すると、1ページ目(MessageViewController)を表示する際に、

tableView.delegate = self

の箇所でクラッシュしてしまいます。

tableViewがnilになっていました。
色々調べたところ、Storyboardを指定しなければいけないと書いているサイトがあったので、指定してみました。

//MessageViewController.swift override func viewDidLoad() { super.viewDidLoad() let storyboard = UIStoryboard(name: "Main", bundle: nil) //追加 let viewController1 = storyboard.instantiateViewController(withIdentifier: "message") //修正 viewController1.title = "Child View 1" let viewController2 = storyboard.instantiateViewController(withIdentifier: "pips") //修正 viewController2.title = "Child View 2" let viewControllers = [viewController1, viewController2] let option = PageMenuOption(frame: CGRect(x: 0, y: 20, width: self.view.frame.size.width, height: self.view.frame.size.height - 20)) let pageMenu = PageMenuView(viewControllers: viewControllers, option: option) self.view.addSubview(pageMenu)

上記のコードに修正してみたところ、
ViewDidLoadがループで何度も呼ばれるようになってしまいました。

正しい記述方法をご教示頂けますと幸いです。
何卒 よろしくお願い致します。

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

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

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

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

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

fuzzball

2017/12/26 05:57

tableViewはどこで、どのように宣言/定義されているのでしょうか?
niship

2017/12/26 06:03

fuzzball様 有難うございます。 @IBOutlet weak var tableView: UITableView!として、Main.storyboardからMessageViewController.swiftに接続しています。
guest

回答1

0

ベストアンサー

tableViewのアウトレットの接続が出来ていないと思われますので、接続を再確認して下さい。
(ゴミが残っている可能性もありますので、不要な接続は削除して下さい)

【追記】

MessageViewControllerとPipsViewControllerをページとして登録したいのであれば、それとは別に管理用(?)のViewControllerを用意しないといけません。

その上で、後半のコードのようにStoryboardから二つのViewControllerを生成し、登録してやればいいと思います。

投稿2017/12/26 06:06

編集2017/12/26 06:40
fuzzball

総合スコア16731

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

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

niship

2017/12/26 06:17

fuzzball様 ご回答有難うございます。 tableViewを接続し直しました。不要な接続は確認しましたが、見当たりませんでした。 その後に、storyboardを指定しない方法で記述しましたが、やはりtableView.delegate = selfのところでクラッシュしてしまいます。
fuzzball

2017/12/26 06:22

MessageViewControllerはどうやって生成していますか?
niship

2017/12/26 06:28

MessageViewControllerもstoryboardで生成しており、storyboardのcustom classでMessageViewController.swiftを関連付けています。 今、viewDidLoadの流れを見ていたところ、viewDidLoadが2回呼ばれており、1回目に呼ばれたときにはtableViewが存在しています。2回目に呼ばれた時にnilになっています。
niship

2017/12/26 06:34 編集

viewDidLoad内のtableView.delegate = selfなどの他のコードを全て削除して、pageMenuを作成するコードのみに残して、流れをみてみたところ、2回ではなく、viewDidLoadがループで呼ばれていました。2回目の時点でtableViewはnilになっていました。
fuzzball

2017/12/26 06:41 編集

あー、2回目の方はviewDidLoad()の中の let viewController1 = MessageViewController() これですね。
niship

2017/12/26 06:40

pageMenuを作成するコードを省いて、viewDidLoadの中身を空にすると、当然viewDidLoadは一度しか呼ばれていないのですが、pageMenuを作成するコードでviewDidLoadをループで呼んでしまう処理があるのでしょうか?
fuzzball

2017/12/26 06:41

回答に追記しました。
niship

2017/12/26 06:45

解決致しました。 いつも有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問