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

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

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

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

Swift

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

Q&A

解決済

1回答

1172閲覧

tableViewから遷移したViewをTabBarに属させない方法

Ytan

総合スコア39

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/09/19 15:05

編集2020/09/20 15:18

イメージ説明
現在TableViewの各Cellで異なる遷移先を試したくて上記のようなものを作ったのですが
四つの遷移先はTabBarに属させたくないのですがその場合どうすれば良いですか?
もしかしたら聞くまでもないことかもしれませんが、よろしくお願いします。

一応遷移元のコード載せときます。

import UIKit class FirstViewController: UIViewController { @IBOutlet weak var tableView: UITableView! var segues: [Segue] = [ Segue(segue: "segue0", title: "aaaaaaaa"), Segue(segue: "segue1", title: "bbbbbbbb"), Segue(segue: "segue2", title: "cccccccc"), Segue(segue: "segue3", title: "dddddddd") ] override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self } } extension FirstViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) switch indexPath.row { case KindOfSegue.segue0.rawValue: self.performSegue(withIdentifier: KindOfSegue.segue0.segueIdentifier, sender: nil) case KindOfSegue.segue1.rawValue: self.performSegue(withIdentifier: KindOfSegue.segue1.segueIdentifier, sender: nil) case KindOfSegue.segue2.rawValue: self.performSegue(withIdentifier: KindOfSegue.segue2.segueIdentifier, sender: nil) case KindOfSegue.segue3.rawValue: self.performSegue(withIdentifier: KindOfSegue.segue3.segueIdentifier, sender: nil) default: break } } } extension FirstViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return segues.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let segue = segues[indexPath.row] cell.textLabel?.text = segue.title cell.accessoryType = UITableViewCell.AccessoryType.disclosureIndicator return cell } } struct Segue { var segue = "" var title = "" } enum KindOfSegue: Int { case segue0 = 0 case segue1 = 1 case segue2 = 2 case segue3 = 3 var segueIdentifier: String { switch self { case .segue0: return "segue0" case .segue1: return "segue1" case .segue2: return "segue2" case .segue3: return "segue3" } } var cellTitle: String { switch self { case .segue0: return "" case .segue1: return "" case .segue2: return "" case .segue3: return "" } } }

Segueを削除して新しくファイルを4つ作りそれぞれのViewに割り当てました。
GyazoGIF参考動画
変更後

import UIKit private struct Segue { var title = "" let `class` : AnyClass } class FirstViewController: UIViewController { @IBOutlet weak var tableView: UITableView! private var segues: [Segue] = [ Segue(title: "aaaaaaaa", class: Segue0ViewController.self), Segue(title: "bbbbbbbb", class: Segue1ViewController.self), Segue(title: "cccccccc", class: Segue2ViewController.self), Segue(title: "dddddddd", class: Segue3ViewController.self) ] override func viewDidLoad() { super.viewDidLoad() self.tableView.rowHeight = 60 tableView.delegate = self tableView.dataSource = self } } extension FirstViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let segue = self.segues[indexPath.row] let vcClass = segue.class as! UIViewController.Type let vc = vcClass.init() self.navigationController?.pushViewController(vc, animated: true) tableView.deselectRow(at: indexPath, animated: true) } } extension FirstViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.segues.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let segue = self.segues[indexPath.row] cell.textLabel?.text = segue.title // cell.accessoryType = UITableViewCell.AccessoryType.disclosureIndicator return cell } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

TabController や Navigation Controller の管理下から離れたいのであれば、Segue でつなげるのではなく、直接インスタンス化させるようにすればお望みの結果になるかと思います。

イメージ説明

インスタンス化したい View Controller に StoryBoard ID を付け、

Swift

1 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 2 // MARK: ここで deselectRow を実行してはいけない 3// tableView.deselectRow(at: indexPath, animated: true) 4 5 // 表示させたい View Controller をインスタンス化。 6 // ここでは、選択した行番号に合わせてデータを表示させたいので、indexPath.row も得ている 7 if let nextVC = storyboard?.instantiateViewController(identifier: "SelectedViewController") as? SelectedViewController, let row = tableView.indexPathForSelectedRow?.row { 8 // 9 nextVC.labelTitle = data[row] 10 11 // Full Screen 表示にする 12 nextVC.modalPresentationStyle = .fullScreen 13 14 // 表示する 15 present(nextVC, animated: true, completion: nil) 16 } 17 18 tableView.deselectRow(at: indexPath, animated: true) 19 }

こんな感じで実行すれば、TableView から先の View Controller には Tab Bar がつかなくなります。

投稿2020/09/19 21:30

TsukubaDepot

総合スコア5086

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

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

Ytan

2020/09/20 01:20 編集

[let row = tableView.indexPathForSelectedRow?.row]が[選択した行番号に合わせてデータを表示させたいので、indexPath.row も得ている]だと思われるのですが、StoryBoard IDを一つのViewでしか書いていませんが、Cellそれぞれで違うViewに遷移するにはnextVCをそれぞれのView一つず作る必要があるということですか?
TsukubaDepot

2020/09/20 12:57

それは、TableViewCell をタップした後に表示させる画面の設計し次第かと思います。 StoryBoard で各 View Controller に ID をつけ、instantiateViewController(identifier:) で呼び出す方法もあるでしょうし、ViewController を追加するときに XIB ファイルも作り、直接インスタンス化させれば、個別に ID を管理する必要がなくなるかもしれません。 また、遷移先の画面がある程度使い回しできるようであれば、画面遷移時に何らかのパラメータを渡し、それに応じて画面表示を変える、という手もあるかと思います。 ただ、直接 Segue でつなげてしまうと、TabBar Controller なり Navigation Controller なりの影響を受けてしまいますから、Segue を使わないでインスタンス化する必要はあるのではないでしょうか。 最近目にしたものだと、遷移先のクラスなどの情報を入れたクラスを配列にし、それを使って View Controller をインスタンス化させている例もみました。 https://github.com/danielgindi/Charts/blob/master/ChartsDemo-iOS/Swift/DemoListViewController.swift こういうやり方も参考になるかもしれません。
Ytan

2020/09/20 15:06

リンクありがとうございます。 そのようなやり方もあるのですね! 試しに実証してみたのですが挙動が少しおかしいのですが、Cdoeを追加したのでよろしかったらご確認お願いします。
TsukubaDepot

2020/09/20 19:23

「挙動が少しおかしい」というのは、具体的にどのような状態なのでしょうか。 試されたコードをやってみましたが、少なくともコードの記述どおりには正しく画面遷移をしています。
Ytan

2020/09/21 06:11

遷移先のViiewにそれぞれLabelを作っているのですが、GIFにもありますが遷移後画面は暗いですし、TabBarにも属しています。(元々navigationController?.pushViewControllerで遷移しているからなのかもしれませんが)
TsukubaDepot

2020/09/21 06:13

画面が暗い理由はわかりませんが、pushViewController で遷移すると、NavigationController の管理下に入るため、TabBarの影響も引きずってしまいます。 present()で表示してみてはいかがでしょうか。
Ytan

2020/09/21 09:15

分かりました。探ってみます。 ありがとうございます!
Ytan

2020/09/21 09:41

仮にTabBarは管理下では無くNavigationControllerだけ管理下に置くことは可能ですか?
Ytan

2020/09/21 14:37

なるほど、そのような物も存在するのですね! 思うようなものになりました!大変助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問