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

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

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

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

Swift

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

Q&A

解決済

2回答

4073閲覧

Could not cast value of type..というエラーが解決できない

Hyperbolic4183

総合スコア17

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/07/01 22:12

編集2020/07/01 22:52

##困っていること
performsegueで画面遷移をさせたいが、Could not cast value of type '_ChatApp.forbidenViewController' (0x103263768) to '_ChatApp.ChatViewController' (0x103262dd8).というエラーが出てクラッシュしてしまう。

##詳細
アプリの名前はChatAppで、NavigationControllerとTableViewControllerでできているJoinedRoomViewControllerからforbidenViewControllerへモーダル遷移を行いたい。JoinedRoomViewControllerはTableViewCellをタップした時に

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { performSegue(withIdentifier: "cellSegue", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let indexPath = self.roomTableView.indexPathForSelectedRow let NextVC = segue.destination as! ChatViewController//ここにThread 1: signal SIGABRTと出る NextVC.roomName = self.joinedRoomName[indexPath!.section]! NextVC.roomPassword = self.joinedRoomPassword[indexPath!.section]! NextVC.password = "(joinedRoomName[indexPath!.section]!)(joinedRoomPassword[indexPath!.section]!)" }

で遷移と値渡しを行なっている。

モダール遷移は

if Auth.auth().currentUser == nil { print("ログインしていない") performSegue(withIdentifier: "ban", sender: nil) }

という形で行っている。

よろしくお願いします。

追記
みなさまコメント・回答ありがとうございます。

import UIKit import Firebase import FirebaseAuth class JoinedRoomViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var roomTableView: UITableView! @IBOutlet weak var protocolButton: UIBarButtonItem! var reportBool = false var userDefaults = UserDefaults.standard var joinedRoomName: [String?] = [] var joinedRoomPassword: [String?] = [] var password = "" let cellSpacingHeight: CGFloat = 5 override func viewDidLoad() { super.viewDidLoad()//追加 overrideUserInterfaceStyle = .light self.navigationController?.navigationBar.barTintColor = UIColor(red: 24/255, green: 129/255, blue: 124/255, alpha: 1.0) self.navigationController?.navigationBar.tintColor = .white self.navigationController?.navigationBar.titleTextAttributes = [ .foregroundColor: UIColor.white ] roomTableView.delegate = self roomTableView.dataSource = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) joinedRoomName = (userDefaults.array(forKey: "name") ?? []) as [String] joinedRoomPassword = (userDefaults.array(forKey: "password") ?? []) as [String] if Auth.auth().currentUser == nil { print("ログインしていない") performSegue(withIdentifier: "ban", sender: nil) } else { print("ログインしていてidは(Auth.auth().currentUser?.uid)") } roomTableView.reloadData() } func numberOfSections(in tableView: UITableView) -> Int { return self.joinedRoomName.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell:UITableViewCell = (self.roomTableView.dequeueReusableCell(withIdentifier: "cell") as UITableViewCell?)! // note that indexPath.section is used rather than indexPath.row cell.textLabel?.text = self.joinedRoomName[indexPath.section] cell.layer.shadowOffset = CGSize(width: 0.0, height: 2.0) cell.layer.shadowColor = UIColor.black.cgColor cell.layer.shadowOpacity = 0.6 cell.layer.shadowRadius = 4 cell.clipsToBounds = true return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { performSegue(withIdentifier: "cellSegue", sender: nil) } private func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 44 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return cellSpacingHeight } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = UIView() headerView.backgroundColor = UIColor.clear return headerView } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let indexPath = self.roomTableView.indexPathForSelectedRow let NextVC = segue.destination as! ChatViewController NextVC.roomName = self.joinedRoomName[indexPath!.section]! NextVC.roomPassword = self.joinedRoomPassword[indexPath!.section]! NextVC.password = "(joinedRoomName[indexPath!.section]!)(joinedRoomPassword[indexPath!.section]!)" }

遷移の詳細

コードと遷移の写真を追加しました。

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

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

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

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

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

y_waiwai

2020/07/01 22:31

コードを提示しましょう。 一部分だけ出されてもどーしよーもないです
Hyperbolic4183

2020/07/01 22:55

コメントありがとうございます。 追加しました。
guest

回答2

0

ベストアンサー

エラーメッセージの通り、forbidenViewControllerChatViewController にキャストしようとして失敗しています。

Swift

1 let NextVC = segue.destination as! ChatViewController//ここにThread 1: signal SIGABRTと出る

ここで強制キャストしている型名が間違いか(forbidenViewControllerの間違い?)、あるいは

Swift

1func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 2 performSegue(withIdentifier: "cellSegue", sender: nil) 3 }

ここで使っているSegueの張り間違いのどちらかでしょうか。


条件分岐の例(switch-case でもいいですし、それ以外のやり方もあると思います)

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 // Do any additional setup after loading the view. 7 } 8 9 @IBAction func toFirstButton(_ sender: Any) { 10 performSegue(withIdentifier: "toFirst", sender: nil) 11 } 12 13 @IBAction func toSecondButton(_ sender: Any) { 14 performSegue(withIdentifier: "toSecond", sender: nil) 15 } 16 17 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 18 if segue.identifier == "toFirst" { 19 print("toFirst Segue") 20 // 処理 21 22 } else if segue.identifier == "toSecond" { 23 print("toSecond Segue") 24 // 処理 25 } else { 26 // 必要だったら想定外の処理 27 } 28 } 29}

投稿2020/07/01 22:39

編集2020/07/02 00:03
TsukubaDepot

総合スコア5086

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

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

Hyperbolic4183

2020/07/01 22:54

確認しましたが、解決できませんでした。 ソースと写真を追加したので確認いただけると幸いです。
TsukubaDepot

2020/07/02 00:04

ひとつの viewController から複数のSegueを貼っているのであれば、prepareで条件分岐させる必要がありますのでご確認ください。例は回答本文に追記いたしました。 あとは、やはりSegueのidentifierや遷移先を再度確認されるのも良いかと思います(どのタイミングで落ちているのか不明なので)。
Hyperbolic4183

2020/07/02 07:09

segue.identifierの条件分岐で解決することができました。ありがとうございました!
guest

0

全体像がわかりませんが、遷移先にキャストしてあげるのでは?

swift

1let NextVC = segue.destination as! ChatViewController

swift

1let NextVC = segue.destination as! ForbidenViewController // f -> F

投稿2020/07/01 22:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Hyperbolic4183

2020/07/01 22:53

書き換えるということですか?
退会済みユーザー

退会済みユーザー

2020/07/01 23:46 編集

遷移先とキャスト先があべこべになってるんでは?ってだけで、 f->Fは読んでて気持ち悪いからアッパーキャメルケース適用してねってだけです。 親切丁寧なTsukubaDepotさんをおすすめしま〜す。
TsukubaDepot

2020/07/02 00:06

エスパー力はtyobigorou先生には敵いませんよ????
Hyperbolic4183

2020/07/02 07:08

コメントありがとうございました!解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問