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

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

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

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

Q&A

解決済

2回答

3682閲覧

【Swift 3.0】画面遷移はViewControllerからじゃないとできない?

user0024

総合スコア12

Swift

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

0グッド

0クリップ

投稿2017/07/06 15:01

編集2017/07/06 16:33

###前提・実現したいこと
Swift3.0でTableViewのセルをタップして別のStoryboardにあるViewControllerに画面遷移させたいのですが,
画面遷移させる以下のメソッド

Swift

1present(viewController, animated: true, completion: nil)

がTableViewクラスで実装できません.
このような場合はTableViewControllerを使うしか方法はないのでしょうか?

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

Use of unresolved identifier 'present'

###該当のソースコード

Swift

1/* 2 * FolderTableView.swift 3 */ 4import UIKit 5 6class FolderTableView: NSObject, UITableViewDelegate, UITableViewDataSource { 7 8 // 途中省略 9 10 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 11 12 let storyboard: UIStoryboard = UIStoryboard(name: "Task", bundle: nil) 13 14 let taskListViewController = storyboard.instantiateViewController(withIdentifier: "Task") 15 self.present(taskListViewController, animated: true, completion: nil) 16 ↑このメソッドで画面遷移させたい 17 } 18 19}

Swift

1/* 2 * FolderListViewController.swift 3 */ 4import UIKit 5import RealmSwift 6 7class FolderListViewController: UIViewController { 8 9 @IBOutlet weak var folderTableView: UITableView! 10 11 let folderTable = FolderTableView() 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 folderTableView.delegate = folderTable 17 folderTableView.dataSource = folderTable 18 19 } 20 21 // 省略 22 23} 24

###試したこと
・TableViewを呼び出しているFolderListViewController内でpresentメソッドを実装
→セルをタップした時にfolderTableView.delegate = folderTableの行で以下のエラーが発生

fatal error: unexpectedly found nil while unwrapping an Optional value

・presentメソッド用のViewControllerクラスを作成し,FolderTableViewでメソッドを呼び出す
→セルをタップした時に以下のエラーが発生

Warning: Attempt to present <skillup7.TaskListViewController: 0x7f98eb423650> on <skillup7.TestViewController: 0x7f98eb522230> whose view is not in the window hierarchy!

↓↓用意したViewControllerクラス↓↓

Swift

1/* 2 * TestViewController.swift 3 */ 4import UIKit 5 6class TestViewController: UIViewController { 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // Do any additional setup after loading the view. 12 } 13 14 override func didReceiveMemoryWarning() { 15 super.didReceiveMemoryWarning() 16 // Dispose of any resources that can be recreated. 17 } 18 19 func send(viewController: UIViewController) { 20 self.present(viewController, animated: true, completion: nil) 21 } 22 23}

###補足情報(言語/FW/ツール等のバージョンなど)
言語:Swift 3.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

Use of unresolved identifier 'present'

が出る原因は、FolderTableViewクラスにpresentメソッドが定義されていないためです。
presentメソッドはUIViewControllerで定義されているメソッドですから、
UIViewControllerを継承したクラスで実行する必要があります。

どうしてFolderTableViewクラスを作っているのかわかりませんが、
ここでtableViewのdelegateを処理するのではなく、
FolderListViewControllerで処理すれば呼び出せます。

(サンプル)

swift

1/* 2 * FolderListViewController.swift 3 */ 4import UIKit 5import RealmSwift 6 7class FolderListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 8 9 @IBOutlet weak var folderTableView: UITableView! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 folderTableView.delegate = self 15 folderTableView.dataSource = self 16 17 } 18 19 // 途中省略 20 21 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 22 23 let storyboard: UIStoryboard = UIStoryboard(name: "Task", bundle: nil) 24 25 let taskListViewController = storyboard.instantiateViewController(withIdentifier: "Task") 26 self.present(taskListViewController, animated: true, completion: nil) 27 } 28}

質問に書かれていることを実施するだけなら、FolderTableViewクラスもTestViewControllerも不要だと思います。

投稿2017/07/06 21:59

TakeOne

総合スコア6299

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

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

user0024

2017/07/10 03:07

コメントありがとうございます。 TakeOneさんのコメントからヒントを得ることができました。
guest

0

segueは簡単にオブジェクトから作れます。
メインストーリーボード画面を開いて、右下のツールボックス、◉マークをクリック、ViewController、Viewを追加します。ドラッグ&ドロップで、画面の余白に自由に配置できます。そして、最初のViewController画面の■マークを右クリックして、次のViewの画面上にドラッグアンドドロップして、開くポップアップ画面から、present modallyを選んでコンパイル、もしくはビルドするだけです。トプ画面のメニューボックス(右横)の Is Initial pageにチェックを入れることも重要です。トップ画面にどれでもなれます。

投稿2017/07/06 16:29

grandcross_info

総合スコア130

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

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

user0024

2017/07/06 16:37

ご回答ありがとうございます. 大変申し訳ございません.情報不足でした. 遷移したい先が別のStoryboardにあるViewControllerなのでSegueを利用することができないと思われます. 質問内容の方を更新させていただきました. もしよろしければ,上記の条件のもとでの解決策・アドバイスをいただけないでしょうか?
grandcross_info

2017/07/07 05:15 編集

TableViewであれば、やはり、◉マークから、テキストボックスや、ボタン、ナビゲーションツールなどを、ドラッグ&ドロップし、そのツールの上で、右クリックして、あとは、そのボタンなり、テキストビューなり、を右クリックして、ViewControllerの上にドラッグします。すると、ポップアップ(動作設定ウィンドウが開くので)、Present modallyを選んでください。それだけで、リンク(セグエ)完了です。また、TableViewController.m(objective-c)(swift?)での実装は、デリゲートが必要な場合があり、TableViewController.m へのViewControllerの接続が必要です。 @interface TableView : UITableView @end //delegate @interface ViewController : UIViewController <UIViewControllerDelegate> @end @interprition ..........
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問