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

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

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

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift

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

Q&A

解決済

3回答

8643閲覧

テーブルビューがうまく表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift

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

0グッド

0クリップ

投稿2015/10/14 03:31

編集2015/10/15 04:23

メモ帳アプリを作りたいのですが、ViewControllerクラスにUiTextViewを配置し、TableViewクラスにそのUiTextViewで書き込んだ内容をテーブル表示したいのですが上手くテーブル表示されません。

iPhoneに元々入っているようなメモ帳アプリのように、初めにTableViewのページを表示し、ボタンを押すことでテキスト入力画面へ移動し、ナビゲージョンコントローラーを使ってTableViewの画面へ戻ってその内容をテーブル表示したいと考えています。

値の受け渡しはAppDelegateを使って行っていてAppDelegateクラスにはlistという配列を用意しています。値の受け渡しには成功していると思うのですが、何がいけないのでしょうか?
ViewDidLoadメソッドにprint関数を用意しapp.listを入れてみましたがアプリ起動後の一度だけしか呼ばれていませんでした。
ナビゲーションコントローラでバックをするとそのページはコードを読み込まれていないのでしょうか?

書き込んだテキストはボタンを押すことで値を渡すようにしています。
汚いコードですがよろしくお願いいたします。

import UIKit class ViewController: UIViewController { @IBOutlet weak var myText:UITextView! let appDele = UIApplication.sharedApplication().delegate as! AppDelegate @IBAction func btn(sender:UIButton){ appDele.list.append(myText.text) } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
import UIKit class TableView: UITableViewController { let app = UIApplication.sharedApplication().delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return app.list.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .Default,reuseIdentifier: "myCell") cell.textLabel?.text = app.list[indexPath.row] as String return cell } }

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

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

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

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

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

guest

回答3

0

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellというメソッドは、

tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int というメソッドの戻り値(int型)が返す値と同じ回数呼ばれます。つまりnumberOfRowsInSectionメソッドの戻り値がint型の5であれば、cellForRowAtIndexPath メソッドは合計5回呼ばれます。ご記載の内容からしますと、list3の要素数をカウントしてそれをnumberOfRowsInSectionの戻り値としてらっしゃいますが、numberOfRowsInSectionメソッドが呼ばれるタイミングでlist3の要素数は0のままです。結果、cellForRowAtIndexPathが一度も呼ばれずにUItableViewには何も表示されないという現象が起きているのだと思います。

解決策としては、viewDidLoadメソッドの中でapp.listの値をlist3に代入するという方法があります。viewDidLoadメソッドはnumberOfRowsInSectionよりも先に呼ばれるメソッドなので、viewDidLoadの中でapp.listの値をlist3に代入しておけば、numberOfRowsInSectionが呼ばれる時にはlist3には配列のデータが保存されていて、配列の要素数と同じ数だけcellForRowAtIndexPathが呼ばれます。

投稿2015/10/14 09:08

Unixer

総合スコア143

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

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

退会済みユーザー

退会済みユーザー

2015/10/15 01:52

ご回答ありがとうございます。 しかしviewDidLoadの中に list3 += app.list というコードを足して実行してみてもテーブル表示はされませんでした。 代わりにデバックエリアに Message from debugger: Terminated due to signal 15 というエラー?のようなものが出てきたのですがどういうことなのでしょうか?
Unixer

2015/10/15 02:06

TableViewクラスの中で var list3:[String] = [] と空の配列が初期化されていますが、これを var list3:[String]! に修正します。宣言だけ行い、初期化を行いません。その後viewDidLoad内で list3 += app.list ではなく list3 = app.list としてください。
退会済みユーザー

退会済みユーザー

2015/10/15 04:06

viewDidLoadの中にprint関数でapp.listを入れてみましたがアプリが起動した初めだけしか呼ばれていませんでした。 テキスト入力画面からナビゲーションコントローラを使いTableViewのページへバックするのではコードは読み込まれていないのでしょうか?
guest

0

おっしゃる通りapp.listを直接使う方法が最もシンプルで理想的ですね。

投稿2015/10/15 02:59

Unixer

総合スコア143

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

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

0

ベストアンサー

list3は何のために用意しているのでしょうか?
app.listを直接使えばいいような気がしますが。

swift

1override func viewWillAppear(animated: Bool) { 2 super.viewWillAppear(animated) 3 self.tableView.reloadData() 4} 5 6override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 7 return app.list.count 8} 9 10override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 11 let cell = UITableViewCell(style: .Default,reuseIdentifier: "myCell") 12 13 cell.textLabel?.text = app.list[indexPath.row] as String 14 15 return cell 16} 17 18override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 19 return 1 20}

投稿2015/10/15 02:39

編集2015/10/15 05:31
fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2015/10/15 04:00

そうですね! 必要のない変数でした! しかしapp.listを使って実装してみても表示されませんでした
fuzzball

2015/10/15 04:20 編集

numberOfSectionsInTableViewがreturn 0のままでしたらreturn 1に修正して下さい。(回答にも追記しておきました)関数ごとコメントアウトしてもかまいません。これは、テーブルの中のセクション数を返す関数です。0だと「セクションが無い=何も表示しない」ということになってしまいます。
退会済みユーザー

退会済みユーザー

2015/10/15 04:46 編集

fuzzball様のいう通りコードを付け足してみましたがダメでした。 質問文を編集し直しましたのでそちらにも記載させていただきましたが、iPhoneに元々入っているようなメモ帳アプリのように、初めにTableViewのページを表示し、ボタンを押すことでテキスト入力画面へ移動し、ナビゲージョンコントローラーを使ってTableViewの画面へ戻ってその内容をテーブル表示したいと考えています。 書いていなかったのですが、初めにテキストページではなくテーブルビューのページを表示しています。 ナビゲーションコントローラーを使ってテーブルビューのページへ戻ることに何か問題があるのでしょうか? viewDidLoadの中に記載したprint(app.list)はアプリを立ち上げた初めの一度だけしか呼ばれていませんでした
fuzzball

2015/10/15 04:51

問題点の切り分けをします。 AppDelegateのlistの初期化を、var list:[String] = ["text1","text2","text3"] という風に初期値を与えてもテーブルは表示されないでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/15 05:10

AppDelegateに初期値を与えると text1 text2 text3 というようにテーブル表示は成功しています。
退会済みユーザー

退会済みユーザー

2015/10/15 05:13

テキストを書き込みナビゲーションコントローラーを使って前の画面に戻っても何も変わらず text1 text2 text3 と表示されています
fuzzball

2015/10/15 05:32 編集

「表示されませんでした」ということだったのでテーブルの表示に問題があるのかと思っていましたが、テキスト入力後、TableViewControllerに戻ってきたとき、テーブルが更新されない、とういことですね。それでしたら、viewWillAppearでテーブルを更新してやれば大丈夫です。コードを追記しておいたので参考にして下さい。
退会済みユーザー

退会済みユーザー

2015/10/15 05:37

出来ました! ありがとうございます! とても助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問