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

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

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

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

541閲覧

(Swift)画面遷移でのUse of undeclared type エラーを解決したい

kamimaru

総合スコア2

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/08/23 21:19

前提・実現したいこと

iphoneのアプリ開発の基礎で画面遷移を実行したいと
考えています。以下のものを参照したのですが、エラーが発生
してしまいました。
https://i-app-tec.com/ios/tap_gesture.html
使っているものはX-codeのSwiftです。

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

let vc2: ViewController2 = (segue.destination as? ViewController2)!

という箇所で、

Use of undeclared 'ViewController2'

というエラーが出ています。
宣言していないものを使うな、というものなのはわかるのですが
どのように宣言すればいいのかわかりません。

該当のソースコード

ViewController

import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func buttonTapped(_ sender : Any) { performSegue(withIdentifier: "toViewController2",sender: nil) } // Segue 準備 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == "toViewController2") { let vc2: ViewController2 = (segue.destination as? ViewController2)! // ViewControllerのtextVC2にメッセージを設定 vc2.textVC2 = "to VC2" } } }

ViewController2

import UIKit class ViewController2: UIViewController { @IBOutlet var label:UILabel! var textVC2:String? override func viewDidLoad() { super.viewDidLoad() label.text = textVC2 } }

試したこと

このエラーについて調べましたが、理解できず
試せたことはありません。

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

X-code 11.6
Swift5

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードは間違っていません(念のため試してみましたが、問題ありませんでした)。

Xcode でこの手のエラーが出る原因で一番多いのは、ViewController2.swift が自動保存されていない場合に起きることが多いように感じています(保存されていないので、他のクラスで宣言した変数などが見えない)。

なので、一度 Cmd + S や Save でファイルを保存すれば解決しますし、おそらくこの回答をみたときには一度再起動している可能性もあるので解決しているのではないでしょうか。

ちなみに、参考にされている記事はいくつか問題が見られます。

たとえば、

  • ボタンに対して Segue を設定しているのに、別途ボタンを押した時に performSegue(withIdentifier:sender:) を実行するようになっているため、ViewController2 を二回インスタンス化(最終的には表示する)ようななっている。
  • ViewController2 から ViewController に戻る処理に Segue を使っている。

前者については、実行時に Warning が出る上、重複して表示されないようになっていますが、決してお勧めできる方法ではありません。そもそも、ボタンに対して Segue を関連づけているのであれば、明示的に performSegue(withIdentifier:sender:)を実行する理由はありません。

後者については、一見問題が無いように見えますが、実際は戻るのではなく新しく ViewController をインスタンス化し、表示しています。

なので、延々とボタンを押し続けていくと、ViewController と ViewController2 が延々と増え続け、最後にはメモリ不足などで動作不安定などになる可能性が高いと思われます。

ViewController2 から ViewController に「戻る」のであれば、本来は dismiss で ViewController2 を消すのが普通だと思われます。

評価の定まった資料を使われることをお勧めします。

投稿2020/08/24 02:30

TsukubaDepot

総合スコア5086

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

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

kamimaru

2020/08/24 08:52

ありがとうございます。大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問