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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

1回答

1855閲覧

uikitでの画面遷移ができない(segue)

Himukin

総合スコア0

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/11/04 05:50

前提・実現したいこと

uikitを使って画面遷移したいのですが、関連付け?の問題でエラーが起こっています。
超初心者で右も左もわからないのですが、教えて頂けると幸いです。
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

画面遷移できない

Thread 1: "Receiver (<RamenInfo.ViewController: 0x11f00db90>) has no segue with identifier 'toSubViewController'"

該当のソースコード

swift.uikit

1import UIKit 2import SwiftUI 3 4 5class ViewController: UIViewController , 6UITableViewDataSource, UITableViewDelegate{ 7 8 @IBOutlet var table:UITableView! 9 10 // section毎の画像配列 11 let imgArray: NSArray = [ 12 "陽はまたのぼる","せい家", 13 "つけ麺 陽","味噌ガッツ", 14 "一蘭","img5", 15 "img6","img7"] 16 17 let label2Array: NSArray = [ 18 "陽はまたのぼる","せい家", 19 "つけ麺 陽","味噌ガッツ", 20 "一蘭","8/23/17:21", 21 "8/23/17:33","8/23/17:41"] 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 } 26 27 //Table Viewのセルの数を指定 28 func tableView(_ table: UITableView, 29 numberOfRowsInSection section: Int) -> Int { 30 return imgArray.count 31 } 32 33 //各セルの要素を設定する 34 func tableView(_ table: UITableView, 35 cellForRowAt indexPath: IndexPath) -> UITableViewCell { 36 37 // tableCell の ID で UITableViewCell のインスタンスを生成 38 let cell = table.dequeueReusableCell(withIdentifier: "tableCell", 39 for: indexPath) 40 41 let img = UIImage(named: imgArray[indexPath.row] as! String) 42 43 // Tag番号 1 で UIImageView インスタンスの生成 44 let imageView = cell.viewWithTag(1) as! UIImageView 45 imageView.image = img 46 47 // Tag番号 2 で UILabel インスタンスの生成 48 let label1 = cell.viewWithTag(2) as! UILabel 49 label1.text = "No." + String(indexPath.row + 1) 50 51 // Tag番号 3 で UILabel インスタンスの生成 52 let label2 = cell.viewWithTag(3) as! UILabel 53 label2.text = String(describing: label2Array[indexPath.row]) 54 55 return cell 56 } 57 // Cell の高さを120にする 58 func tableView(_ table: UITableView, 59 heightForRowAt indexPath: IndexPath) -> CGFloat { 60 return 120.0 61 } 62 var selectedImage: UIImage? 63 var selectedLabel: UILabel? 64 // Cell が選択された場合 65 func tableView(_ table: UITableView,didSelectRowAt indexPath: IndexPath) { 66 // [indexPath.row] から画像名を探し、UImage を設定 67 selectedImage = UIImage(named: imgArray[indexPath.row] as! String) 68 69 70 if selectedImage != nil { 71 // SubViewController へ遷移するために Segue を呼び出す 72 performSegue(withIdentifier: "toSubViewController",sender: nil) 73 } 74 if selectedLabel != nil { 75 // SubViewController へ遷移するために Segue を呼び出す 76 performSegue(withIdentifier: "toSubViewController",sender: nil) 77 } 78 } 79 80 // Segue 準備 81 override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 82 if (segue.identifier == "toSubViewController") { 83 let subVC: SubViewController = (segue.destination as? SubViewController)! 84 85 // SubViewController のselectedImgに選択された画像を設定する 86 subVC.selectedImg = selectedImage 87 } 88 } 89} 90 91 92 93 94 95struct ViewController_Previews: PreviewProvider { 96 97 static var previews: some View { 98 /*@START_MENU_TOKEN@*/Text("Hello, World!")/*@END_MENU_TOKEN@*/ 99 } 100} 101

import Foundation
import UIKit
import WebKit

class SubViewController: UIViewController , WKUIDelegate{
private var webView:WKWebView!

@IBOutlet weak var Label: UILabel! @IBOutlet weak var imageView: UIImageView! var selectedImg: UIImage! override func viewDidLoad() { super.viewDidLoad() imageView.image = selectedImg // 画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIView.ContentMode.scaleAspectFit webView = WKWebView(frame:CGRect(x:0, y:0, width:self.view.bounds.size.width, height:self.view.bounds.size.height))

試したこと

繋いだり、切ったり

補足情報(FW/ツールのバージョンなど)

最新

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

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

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

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

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

guest

回答1

0

Thread 1: "Receiver (<RamenInfo.ViewController: 0x11f00db90>) has no segue with identifier 'toSubViewController'"

このエラーメッセージから確実にいえることは、'toSubViewController' という Identifier がつけられた Segue が見つからない、ということです。

Swift

1 if selectedImage != nil { 2 // SubViewController へ遷移するために Segue を呼び出す 3 performSegue(withIdentifier: "toSubViewController",sender: nil) 4 }

この部分を実行する際、'toSubViewController' と関連づけられた Segue を実行しますが、StoryBoard で該当する Segue の Identifier を設定されていますでしょうか。

また、設定したのであれば、綴り間違いなどはないでしょうか。

その辺りを確認してみるといいかと思います。

ちなみに、

Swift

1 if selectedImage != nil { 2 // SubViewController へ遷移するために Segue を呼び出す 3 performSegue(withIdentifier: "toSubViewController",sender: nil) 4 } 5 if selectedLabel != nil { 6 // SubViewController へ遷移するために Segue を呼び出す 7 performSegue(withIdentifier: "toSubViewController",sender: nil) 8 }

この書き方だと、selectedLabelselectedImage 両者とも nil でない場合には Segue を実行してしまいます。実行時エラーで落ちることはありませんが、同一の View Controller を表示しようとして実行時の警告が出る上に、View Controller は一つしか表示されませんので(当然ですが)、この部分も想定されている処理に書き換えられたほうがいいかと思います。

投稿2020/11/04 08:50

TsukubaDepot

総合スコア5086

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

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

Himukin

2020/11/05 07:10

Segue の Identifierは綴り間違えなく設定しています。 エラーが出ているところの周り以外のコードが間違っているのでしょうか・・・ 下のは重複していたので消しました。
TsukubaDepot

2020/11/05 08:38

コードそのものには問題ないと思います(念のため実行しました)。 エラーそのものが「"Receiver (<RamenInfo.ViewController: 0x11f00db90>) has no segue with identifier 'toSubViewController'" 」と、「ViewController には `toSubViewController' と名付けられたセグエがない」と言っているので、まず間違いなくSegue関連のエラーだと思います。 Identifier は打ち込み間違いが起きやすので、手打ちではなく「コピペ」するのが確実なのですが、それでも発生するのでしょうか。
Himukin

2020/11/05 09:35

コピペで試してみましたがエラーが発生しました。 コード以外でとなると他に何かありますでしょうか・・・
TsukubaDepot

2020/11/05 10:40

時々、ViewController からではなく、セルから Segue をつけていらっしゃる方がいるのですが、それが原因で実行時エラーがでることはありません(これも試してみました)。 ただ、よくある解決法は、「新規にプロジェクトを立ち上げ、コードは流用し、StoryBoard だけ新規で作り直す」と解決する、という方はいらっしゃいます。気づかない間にどこかの設定を変更してしまったためだと思いますが、根本的な解決策ではないので、原因は不明です。 ただ、このトラブルを解決するために時間をかけるよりも、新規に作り直したほうが早いのも確かだと思いますので、試しに作り直されてはいかがでしょうか。 もう一つ気になったのは、SwiftUI を import している上、 PreviewProvider を宣言されている点です。 理屈がわかってそのようにされているのであれば問題ありませんが、もし新規プロジェクトを立ち上げた際に SwiftUI を選択し、後から StoryBoard を選択しているのであれば、それも想定外のトラブルを招く原因になるかと思います(正しい設定方法を分かっていれば追加は可能ですが、そうでなければ最初から UIKit としてプロジェクトを立ち上げたほうがよろしいかと思います)。 その一方、全体的にコードの書き方が古いのも気になっています。 これは何かのコードを参考にされたのでしょうか。
Himukin

2020/11/06 06:47

数人で共同作業しているので新規立ち上げはできない状況です。 ネットのコードをコピペした後に手直しを加えている状況です。 UIKitとして立ち上げています。 デバックエリアにCould not cast value of type 'UIViewController' (0x1f4ec8048) to 'RamenInfo.SubViewController' (0x102e11168). と出ていたのですが、コードの変更ではないとしたら細かい設定で何か間違えているしかないですよね・・・
Himukin

2020/11/06 08:26

moduleが設定されていなくて、設定したら治りました!色々とアドバイスを頂きましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問