前提・実現したいこと
ボタン配置で画面遷移を行いたい
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
}
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。