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

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

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

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

Swift

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

Q&A

解決済

1回答

733閲覧

新規追加されたタブのコンテンツとしてUITableViewを生成する仕組みについて

samson66

総合スコア35

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/08/18 19:10

編集2019/08/19 21:04

メモ帳アプリやTODOアプリなどでメモリストやTODOリストのページをタブごとで分別させて管理するアプリをよく見かけるのですが、そこにはページ(UITableView)を追加(生成)するという機能があります。
tableviewに加えタブの仕組みなどを最近勉強していますが、仕組みが全くわからず前に進めません・・・。
これは一体どのような仕組みで動いているのでしょうか?

少し大雑把な質問になっていたらすみませんm(_ _)m
特にUITableView(またはテーブルビューを含めたUIViewController)をボタンを押したら新規生成する機能について
アドバイスやコーディング、または参考になる記事などあればご教授のほどをお願いしたいです!

以下は実際にあるアプリのイメージです

タブの追加設定画面
イメージ説明

新規タブと共にユーザーによって生成されたUITableView(タブのコンテンツ)
イメージ説明

追記 8/19 14:45
アドバイスを元にデータだけを切り替える仕様で実装。
'[String]' has no member 'String'というエラーが発生。

import UIKit class ViewController: UIViewController { @IBOutlet weak var segmentButton: UISegmentedControl! @IBOutlet weak var tableview: UITableView! var data1 = ["dog","cat","fish","pug"] var data2 = ["river","forest","sea","mountain"] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. tableview.delegate = self } } extension ViewController: UITableViewDelegate,UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if ( segmentButton.selectedSegmentIndex == 0) { return data1.count } else { return data2.count } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) var data = "" if (segmentButton.selectedSegmentIndex == 0) { data = data1.String(indexPath.row)  //Value of type '[String]' has no member 'String' } else { data = data2.String(indexPath.row) //Value of type '[String]' has no member 'String' } cell.textLabel?.text = String(data) return cell } }

storyboard画面
イメージ説明

追記 8/20 5:50
1からやり直し、以下の方法で一つのtableviewファイルに複数のデータを反映させることに成功

・配列の法則に乗っ取り以下のように修正
data1.String(indexPath.row) → data1[indexPath.row]
・if文をswitchでUISegmentedControl.selectedSegmentIndexを判定するように変更
・NavigationControllerがあるとなぜかうまく動かなかったので削除

import UIKit class ViewController: UIViewController { @IBOutlet weak var segmentButton: UISegmentedControl! @IBOutlet weak var tableview: UITableView! let data1 = ["dog","cat","fish","pug"] let data2 = ["river","forest","sea","mountain"] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. tableview.delegate = self tableview.dataSource = self } @IBAction func segmentedChanged(_ sender: Any) { tableview.reloadData() } } extension ViewController: UITableViewDelegate,UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { switch segmentButton.selectedSegmentIndex { case 0: return data1.count case 1: return data2.count default: break } return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) switch segmentButton.selectedSegmentIndex { case 0: cell.textLabel?.text = data1[indexPath.row] case 1: cell.textLabel?.text = data2[indexPath.row] default: break } return cell } }

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

UITableViewのファイル自体は生成せず
データのみ生成し、それの表示を入れ替えているという設計になっていると思います。

UITableViewのファイルは一つで、

UISegmentedControlが
1の時は、「やること1」のデータを読み込む
2の時は、「やること2」のデータを読み込む

という風にするのが、スマート?と感じます。
色やチェックリスト有無などの微細な変更もデータとして持たせれば、
それがありの時はありのviewに、なしの時はなしのviewになどできますし。

まずは1個で作れるか試して、できたら、
segmentedcontrolなどを足してやってみてはでどうでしょうか?
1個でも慣れないとなかなかうまく作れないものですよ。

投稿2019/08/18 22:54

hameji

総合スコア1380

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

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

samson66

2019/08/19 05:50

アドバイスありがとうございますm(_ _)m 早速、簡単なデータを2つ用意しUISegmentedControlによってテーブルビューに 読み込むデータを切り替えれるように実装してみましたが途中でエラーが発生しました。。。 追記に載せたのですが、どのように修正すれば良いでしょうか? 続けて質問してしまいすみません。
hameji

2019/08/19 09:24

本来なら、解決済みにして、別質問にしてもらわないといけないですが、アドバイスまでに。 配列の使い方が間違ってますよ。 わりと基本事項なので、配列の勉強をしてみてくださいね。そもそもstring型で保存してるので、Stringをつける必要はないですよ
samson66

2019/08/19 09:28

ありがとうございます。 別質問をする場合、以後解決済みにしてから行いますm(_ _)m
hameji

2019/08/19 12:59

もう一言だけ付け加えると、 [String]型とString型は違いますよっていうエラーです。 ポイントは同じStringでも [ ] が付いているということが何を意味するのかですね。 配列の勉強をすればわかると思います。 その変換方法も。
samson66

2019/08/19 21:02

ほとんど忘れていた配列を1から学び直しました。。。 時間がかかりましたが、なんとかコード化できました。(追記として追加しました) 基礎が抜けている状態ではこの先も躓くと思うのでその都度忘れないように心がけたいと思います! 助言などありがとうございましたm(_ _)m
hameji

2019/08/19 23:26

治ってる!!! 短時間にextensionで分離もしてて、驚きました。 指摘してない配列のvarもletにきちんとされてるし。 あとは、 ・データの入出力クラスの用意 ・データ編集viewなどの用意 ・segmentControlを可変にするために、コードで作成 or IBOutletの編集 すればほぼ目指してるものができますね。 NavigationControllerは必要かもしれませんが、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問