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

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

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

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

Swift

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

Q&A

1回答

450閲覧

signal SIGABRTが出てしまう

yu_kiabe

総合スコア4

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/02/15 03:05

前提・実現したいこと

ボタン配置で画面遷移を行いたい
xcodeにてファッションアプリのようなものを作っております。
最初の画面で様々な画像を一覧で見れるような感じにし、その画像を押すと次ページにて画像が表示されるように設定が終わり、それとは別に最初の画面でメニューバーなどを設置したくsrory boardにボタンを配置し、新たなView Controllerに紐付けして画面遷移をしたところsignal SIGABRTが出てしましました。

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

signal SIGABRT

該当のソースコード

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let item = sender as! Item if let vc = segue.destination as? ImageViewerViewController { vc.imageName = item.imageName } }

試したこと

storyboard上ではなくソースコードなどで画面遷移を試したが、同様に let item = sender as! Item の箇所にsignal SIGABRTが出てしまう。

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

View Controllerの全体を記載します。

import UIKit

struct Item {
var imageName: String
}

class ViewController: UIViewController {

enum Mode {
case view
case select
}

@IBOutlet weak var collectionView: UICollectionView!

var items: [Item] = [Item(imageName: "1"),
Item(imageName: "2"),
Item(imageName: "3"),
Item(imageName: "4"),
Item(imageName: "5"),
Item(imageName: "6"),
Item(imageName: "7"),
Item(imageName: "8"),
Item(imageName: "9"),
Item(imageName: "10"),
Item(imageName: "11"),
Item(imageName: "12"),
Item(imageName: "1"),
Item(imageName: "2"),
Item(imageName: "3"),
Item(imageName: "4"),
Item(imageName: "5"),
Item(imageName: "6"),
Item(imageName: "7"),
Item(imageName: "8"),
Item(imageName: "9"),
Item(imageName: "10"),
Item(imageName: "11"),
Item(imageName: "12"),
Item(imageName: "1"),
Item(imageName: "2"),
Item(imageName: "3"),
Item(imageName: "4"),
Item(imageName: "5"),
Item(imageName: "6"),
Item(imageName: "7"),
Item(imageName: "8"),
Item(imageName: "9"),
Item(imageName: "10"),
Item(imageName: "11"),
Item(imageName: "12")]

var collectionViewFlowLayout: UICollectionViewFlowLayout!
let cellIdentifier = "ItemCollectionViewCell"
let viewImageSegueIdentifier = "viewImageSegueIdentifier"

var mMode: Mode = .view {
didSet {
for (key, value) in dictionarySelectedIndecPath {
if value {
collectionView.deselectItem(at: key, animated: true)
}
}
dictionarySelectedIndecPath.removeAll()
}
}

var dictionarySelectedIndecPath: [IndexPath: Bool] = [:]

let lineSpacing: CGFloat = 3
let interItemSpacing: CGFloat = 3

override func viewDidLoad() {

super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. setupCollectionView() setupCollectionViewItemSize()

}

override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

let item = sender as! Item if let vc = segue.destination as? ImageViewerViewController { vc.imageName = item.imageName }

}

@IBAction func buttonTapped(sender : AnyObject) { performSegue(withIdentifier: "toViewController2",sender: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }

private func setupCollectionView() {
collectionView.delegate = self
collectionView.dataSource = self
let nib = UINib(nibName: "ItemCollectionViewCell", bundle: nil)
collectionView.register(nib, forCellWithReuseIdentifier: cellIdentifier)
}

private func setupCollectionViewItemSize() {
let customLayout = CustomLayout()
customLayout.delegate = self
collectionView.collectionViewLayout = customLayout
}
}

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource {

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! ItemCollectionViewCell

cell.imageView.image = UIImage(named: items[indexPath.item].imageName) return cell

}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.deselectItem(at: indexPath, animated: true)
let item = items[indexPath.item]
performSegue(withIdentifier: viewImageSegueIdentifier, sender: item)
}
}

extension ViewController: CustomLayoutDelegate {
func collectionView(_ collectionView: UICollectionView, sizeOfPhotoAtIndexPath indexPath: IndexPath) -> CGSize {
return UIImage(named: items[indexPath.item].imageName)!.size
}
}

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

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

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

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

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

guest

回答1

0

performSegue(withIdentifier: "toViewController2",sender: nil)
としてnilを渡しているので、senderがnilなので、エラーが発生しているのだと思います。

collectionView(_:didSelectItemAt:)でやっているように、itemを渡すといいのではないでしょうか。

投稿2020/02/15 04:11

eytyet

総合スコア803

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問