前提・実現したいこと
いつもお世話になってます。
SegementSlideを使ってスクロールメニューを実装していますが、collectionViewのdidSelectItemAtで遷移ができません。storyboard?.instantiateViewControllerを使った場合
(コンパイルにて)エラー
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)が表示されます。
Segueで繋いだ場合、
(デバッグにて)エラー
reason: 'Receiver (<SegementSampleApp.Page1ViewController: 0x7fea13630390>) has no segue with identifier 'toDetailView''が表示されます。
どちらもidを間違いなく入れて普段通りにコーディングしていますが、
SegementSlideやスクロールメニューの実装の場合、元になるページとそこに関わるpageViewの関係性を明示する為に何か他にコードが必要なんでしょうか?お分かりになる方よろしくお願い致します。
該当のソースコード
import UIKit import SegementSlide class ViewController: SegementSlideViewController{ override func viewDidLoad() { super.viewDidLoad() reloadData() scrollToSlide(at: 0, animated: true) self.navigationController?.navigationBar.shadowImage = UIImage() } override var titlesInSwitcher: [String]{ return["2020","2019","2018","2017","アイルトン セナ","ミハエル シューマッハ"] } override func segementSlideContentViewController(at index: Int) -> SegementSlideContentScrollViewDelegate? { switch index{ case 0: return Page1ViewController() case 1: return Page2ViewController() case 2: return Page3ViewController() case 3: return Page4ViewController() case 4: return Page5ViewController() case 5: return Page6ViewController() default:return Page1ViewController() } } }
import UIKit import SegementSlide class Page1ViewController: UIViewController,SegementSlideContentScrollViewDelegate { let keyForStoryborad = "DetailViewController" let keyForSegue = "toDetailView" var searchBar: UISearchBar! var collectionView: UICollectionView! var fileredArray: Array<Array<String>>! var name = String() var place = String() var point = String() var selectedIndex = 0 var carArray: Array<Array<String>> = [["フェラーリ", "Italy","19","ferrari"], ["マクラーレン", "England","39", "maclauren"], ["ルノー", "France","8","renault"], ["レッドブル", "Austria","27","redbull"], ["メルセデス", "Germany","80","amg"], ["ウィリアムズ", "England","0", "wil"], ["アルファタウリ", "Italy","7","alpha"], ["アルファロメオ", "Switzerland","2","alfa"],["ハース","USA","0","haas"],["レーシングポイント","England","22","racing"], ["レッドブル", "Austria","27","redbull"], ["レッドブル", "Austria","27","redbull"], ["レッドブル", "Austria","27","redbull"], ["レッドブル", "Austria","27","redbull"], ["レッドブル", "Austria","27","redbull"], ["レッドブル", "Austria","27","redbull"]] override func viewDidLoad() { super.viewDidLoad() fileredArray = carArray let viewWidth = self.view.frame.width let viewHeight = self.view.frame.height let collectionFrame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight) let statusBar: CGFloat = 44 let searchBarHeight: CGFloat = 44 let switcherHeight: CGFloat = 35 let navigationBarHeight = self.navigationController?.navigationBar.frame.size.height let header = statusBar + searchBarHeight + switcherHeight + (navigationBarHeight ?? 44) let tabBarHeight = tabBarController?.tabBar.frame.size.height ?? 49 let layout = UICollectionViewFlowLayout() layout.itemSize = CGSize(width: 125, height: 180) layout.sectionInset = UIEdgeInsets(top: 6, left: 13, bottom: 6, right: 13) layout.minimumInteritemSpacing = 3 layout.minimumLineSpacing = 6 layout.headerReferenceSize = CGSize(width: viewWidth, height: searchBarHeight) layout.footerReferenceSize = CGSize(width: viewWidth, height: header + tabBarHeight) collectionView = UICollectionView(frame: collectionFrame, collectionViewLayout: layout) collectionView.register(UINib(nibName: "CustomCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "CellForCollection") collectionView.delegate = self collectionView.dataSource = self collectionView.backgroundColor = .white self.view.addSubview(collectionView) searchBar = UISearchBar() searchBar.delegate = self searchBar.frame = CGRect(x: 0, y: 0, width: viewWidth, height: 44) searchBar.showsCancelButton = true searchBar.placeholder = "チーム名検索" self.collectionView.addSubview(searchBar) } @objc var scrollView: UIScrollView { return collectionView } } //MARK: - UISearchBarDelegate extension Page1ViewController:UISearchBarDelegate{ func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { searchItems(searchText: searchText) } func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { searchBar.text = "" self.view.endEditing(true) fileredArray = carArray collectionView.reloadData() } func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { self.view.endEditing(true) searchItems(searchText: searchBar.text! as String) } func searchItems(searchText: String) { if searchText != "" { fileredArray = carArray.filter { car in return car.first!.contains(searchText) } as Array<Array<String>> } else { fileredArray = carArray } collectionView.reloadData() } } //MARK: - UICollectionViewDelegate,DataSource extension Page1ViewController: UICollectionViewDelegate, UICollectionViewDataSource{ func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return fileredArray.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CellForCollection", for: indexPath) as! CustomCollectionViewCell cell.layer.borderColor = #colorLiteral(red: 0.501960814, green: 0.501960814, blue: 0.501960814, alpha: 1) cell.layer.borderWidth = 1.0 cell.layer.cornerRadius = 8.0 cell.carImage.image = UIImage(named: fileredArray[indexPath.row][3]) cell.carImage.contentMode = .scaleAspectFill cell.carName.text = (fileredArray?[indexPath.row][0]) cell.carName.font = cell.carName.font.withSize(13) cell.carName.adjustsFontSizeToFitWidth = true cell.point.text = (fileredArray[indexPath.row][2]) selectedIndex = indexPath.row return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { ****どちらの方法も上手く遷移できません**** 使用時はどちらかをコメントアウトしてビルドしています。 let nextVC = storyboard?.instantiateViewController(identifier: keyForStoryborad) as! DetailViewController name = fileredArray[indexPath.row][0] place = fileredArray[indexPath.row][1] point = fileredArray[indexPath.row][2] nextVC.carName = name nextVC.pointToChampionship = point navigationController?.pushViewController(nextVC, animated: true) performSegue(withIdentifier: keyForSegue, sender: nil) } ****どちらの方法も上手く遷移できません**** override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == keyForSegue){ let nextVC: DetailViewController = segue.destination as! DetailViewController nextVC.carName = name nextVC.pointToChampionship = point } } }
試したこと
StoryboardにUIViewControllerでPage1ViewControllerとDetailViewControllerを紐付けてsegueのwithIdentifier、もしくわstoryboardのidentiferを明記した。
全体のstoryboardはこちらです。ここが悪いのでしょうか?
回答1件
あなたの回答
tips
プレビュー