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

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

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

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

Swift

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

Q&A

解決済

1回答

892閲覧

Main Storyboardへの接続

Narikura

総合スコア6

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/09/08 01:42

前提・実現したいこと

Alamofire,SwiftyJSONを利用しapiを叩き、Qiitaの記事一覧をtableViewに表示、WebViewに記事を表示するアプリを作成したい。

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

Main Storyboardへの接続がおかしい

Thread 1: signal SIGABRT

該当のソースコード

swift

1class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 2 3 var articles: [[String:String?]] = [] 4 5 6 let cellId = "cellId" 7 let tableView: UITableView = { 8 let t = UITableView() 9 return t 10 }() 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 view.addSubview(tableView) 16 tableView.frame.size = view.frame.size 17 tableView.delegate = self 18 tableView.dataSource = self 19 tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId) 20 navigationItem.title = "Qiita Client" 21 getQiitaApi() 22 } 23 24 func getQiitaApi(){ 25 AF.request("https://qiita.com/api/v2/items?page=1&per_page=20", method: .get).validate().responseJSON { response in 26 27 switch response.result { 28 case .success(let value): 29 let json = JSON(value) 30 json.forEach {(_, json) in 31 let article: [String: String?] = [ 32 "title": json["title"].string, 33 "userId": json["user"]["id"].string, 34 "url": json["url"].string 35 ] 36 self.articles.append(article) 37 } 38 self.tableView.reloadData() 39 40 case .failure(let error): 41 print(error) 42 } 43 } 44 } 45 46 47 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 48 return articles.count 49 50 } 51 52 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 53 let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) 54 cell.backgroundColor = .white 55 let article = articles[indexPath.row] 56 57 let ViewController2 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2 58 self.present(ViewController2, animated: true, completion: nil) 59 60 cell.textLabel?.text = article["title"]! 61 cell.detailTextLabel?.text = article["userId"]! 62 63 return cell 64 } 65 66 67 68} 69

試したこと

tableViewを@IBOutlet weak var Tableview: UITableView!と定義してTableViewとViewControllerを接続してみたが、今度はsubViewに関するエラーが出てしまった。(よくわかっていません)

補足情報

イメージ説明
接続がおかしい、定義されていないのが真ん中のviewcontrollerです。

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

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

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

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

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

TsukubaDepot

2020/09/08 02:39

具体的なエラーはどの行ででていますでしょうか。 また、Xcode の一番上を見ると、警告が3つ(⚠️3)となっていますが、これらの内容はどんな感じでしょうか。
Narikura

2020/09/08 04:11

let ViewController2 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2 エラーはこの行に対して行われています。 また、エラーはViewControllerの識別子に関するエラーと、よく理解していないので分かりませんが以下のようなエラーです。 Capabilities for Signing & Capabilities may not function correctly because its entitlements use a placeholder team ID. To resolve this, select a development team in the qiitaApp editor.
TsukubaDepot

2020/09/08 04:44

後半のエラーですが、一回 Xcode のプロジェクト(ここのプロジェクトではなくて、開発者設定など)を行えばこのエラーが出ることはほとんどないので、私自身このエラーについてよく知っているわけではありませんが、エラーメッセージで検索すると例えば次のような事例がありますので、確認していただけますでしょうか。 https://pikucha.sakura.ne.jp/blog/2019/11/25/2019%E5%B9%B4%E4%BB%8A%E6%97%A5%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%81%E3%83%AF%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0capabilities-for-signing-capabilities-may-not-func/
Narikura

2020/09/08 05:06 編集

後半のエラーについては解消しました。ありがとうございます。また、識別子の警告に関しても解消しました。
guest

回答1

0

ベストアンサー

ご提示いただいたコードですが、ほぼ概ね大丈夫なのですが、根本的な間違いが一箇所あります。

Swift

1 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 // 中略 3 let ViewController2 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2 4 self.present(ViewController2, animated: true, completion: nil) 5 6     // 中略 7 8 return cell 9 }

とありますが、この状態だとセルを表示するごとに画面遷移を行なってしまいます。

また、StoryBoard の設定を見る限り、NavigationController を使って遷移しているように見受けられますので、自分で次の画面をインスタンス化(instantiateViewController)し、表示(present)する必要はありません。

いずれにせよ、tableView(_:cellForRowAt:)で行わなければいけないのは、Cell にデータを表示させることだけです。

セルをタップしたときに行う処理は、tableView(_:didSelectRowAt:) で行うことになります。

とりあえず、上記の関数内の余計な部分を消せば、それだけでも一応動くのですが、画面遷移まで反映させたコードはこんな感じになります。

Swift

1import UIKit 2import Alamofire 3import SwiftyJSON 4 5class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 6 // 略 7 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 8 //let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) 9 10 // MARK: - detail を表示するのであれば、dequeue は次の方法で行う 11 let cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellId) 12 13 cell.backgroundColor = .white 14 let article = articles[indexPath.row] 15 16 // MARK: - ここの行は不要 17// let ViewController2 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2 18// self.present(ViewController2, animated: true, completion: nil) 19 20 cell.textLabel?.text = article["title"]! 21 cell.detailTextLabel?.text = article["userId"]! 22 23 return cell 24 } 25 26 // MARK: - Cell をタップしたときの処理 27 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 28 // 選択状態を解除する 29 tableView.deselectRow(at: indexPath, animated: true) 30 31 // 表示させたい URL を抽出する 32 let article = articles[indexPath.row] 33 let url = article["url"]! 34 35 // Segue を実行する。 36 // url を sender の引数として渡すことで、prepare() で受け取られるようになる。 37 performSegue(withIdentifier: "toViewController2", sender: url) 38 } 39 40 // MARK: - 画面遷移の実行 41 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 42 // Segue の識別子(identifier)が "toViewController2" の場合 43 if segue.identifier == "toViewController2" { 44 // 遷移先のクラスが ViewController2 の場合 45 if let nextVC = segue.destination as? ViewController2 { 46 // sender を String 型としてダウンキャストする。 47 if let url = sender as? String { 48 // 成功したら、nextVC(== ViewController2 のインスタンス)の url に代入 49 nextVC.url = url 50 } 51 } 52 } 53 } 54}

遷移先の雛形は次のような感じです。
あとは、url に代入された url を基に WkWebView を操作することになります。

Swift

1import UIKit 2 3class ViewController2: UIViewController { 4 var url: String? 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // Do any additional setup after loading the view. 9 10 // MARK: - URL を表示する。 11 print("表示させたい URL は :", url ?? "不明です。") 12 } 13}

投稿2020/09/08 05:13

TsukubaDepot

総合スコア5086

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

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

Narikura

2020/09/08 05:53 編集

ありがとうございます。確認しましたh。no segue with identifier 'toViewController2というエラーが出てしまい画面遷移がうまくいきませんでした。ViewController2はMainStoryboardとどのように接続されるのが正しいのでしょうか
TsukubaDepot

2020/09/08 06:01

ちなみに、TavleView についてはコード上で直接作っているため、StoryBoard に配置した上 Outlet を接続する必要はございません。 StoryBoard では、ViewControllerにNavigationController をセットし、ViewController2 と Segue で 接続するだけで大丈夫です。
Narikura

2020/09/08 07:48

こちらの勘違いでした。すみません。segueのIdentifierに"to"が抜けておりました。遷移先の画面(Qiitaの記事)が表示される場所が真っ黒になりました。調べてみると画面遷移に関することが出てきて模索していたのですが解決方法がいまいち分かりません。どうしたらいいでしょうか。度々すみません。
TsukubaDepot

2020/09/08 07:59

一つ前のコメントは入れ違いになってしまったようで、話が噛み合っていなかったですね。 さて、遷移先の画面が真っ黒になってしまったということですが、StoryBoard上での遷移先の ViewController にはカスタムクラス(ViewController2)は設定されましたでしょうか(設定されてない場合にはNavigationBar以外に何も表示されない白い画面なので違うと思いますが)。
Narikura

2020/09/08 10:18 編集

失礼いたしました。 画面遷移についてですが、ViewControllerのcustom classの設定はしており、確認しましたが確認後も変化はありませんでした。
TsukubaDepot

2020/09/08 10:22

ViewController2では、print()を使ってURLを表示させていますが、それは表示されますでしょうか。
Narikura

2020/09/08 10:24

補足情報と致しましては、遷移先の画面(Qiitaの記事)は真っ暗な状態ではありますが、エラーコードなどは出ておらず、動作します。また、真っ黒ではありますがtableViewの記事一覧の画面まで戻るボタンで戻ることができます。
Narikura

2020/09/08 10:28 編集

コメントの入れ違いとなってしまいすみません。コンソールの方にはURLも含め出力されております。
TsukubaDepot

2020/09/08 10:30

とすると、どこかの設定が足りないか間違っている可能性が高いと思います。 いちど、新規にプロジェクトを作り、StoryBoard は新規に作り直し、コードだけ流用してみてはいかがでしょうか。 もし、それで遷移先が「白い画面」であれば現時点では正常ですし、そうでなければ StoryBoard の設定がおかしいということになります。
TsukubaDepot

2020/09/08 10:32

ちなみに、「真っ暗な画面」ということですが、実機やシミュレータを「ダークモード」にしているということはありませんでしょうか。 遷移先の画面には何も表示させていないので、遷移しても真っ白(ダークモードだと真っ黒)になります。
Narikura

2020/09/08 10:43

新規プロジェクトで試してみます。ありがとうございます。また、シュミレーターはダークモードではありませんでした
Narikura

2020/09/09 01:15 編集

新規プロジェクトで試しました。黒い画面ではなく次は白い画面に白い画面になりました。URLもコンソールに表示されるようになりました。ありがとうございます。ちなみにですがWebページを表示させるにはViewController2にWKWebViewを設置するという認識でいいでしょうか。
TsukubaDepot

2020/09/13 04:29

そうですね。次の画面に WkWebView を配置して、アウトレットを引っ張り、操作することになるかと思います。 余計なひとこととは思いますが、まずは WkWebView だけで任意のページを表示する例題を作ってみて、それが思い通りに動いてから、今回のプロジェクトと組み合わせると、仮に WkWebView でつまづいても原因の判別がやりやすいかと思います。
Narikura

2020/09/13 10:23

多くの助言、解決策を提示していただきありがとうございました。無事WebViewにも出力できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問