Edited at

[Swift]segueを使った画面遷移、segueを使わない画面遷移

More than 1 year has passed since last update.


1. segue を使った画面遷移

Storyboard でViewControllerを選択してDetailViewControllerとconnectする

identifier を設定(ここでは ”move to detail” )する。

その後、遷移させたいところで以下を記述

self?.performSegue(withIdentifier: "move to detail", sender: image)

画面遷移先に何かしらを受け渡したい場合(今回はcollectionViewのimage)は sender にセットし、以下のように記述。

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

if let image = sender as? UIImage {
if let vc = segue.destination as? DetailViewController {
vc.detail = image
}
}
}


2. segue を使わない画面遷移


流れ


  1. 遷移先のVCがあるstoryboadをインスタンス化

  2. 遷移先のVCをインスタンス化

  3. 遷移先のVCに遷移する


異なるstoryboad上に配置したVCへの遷移

Show the Attributes inspector -> View Controller -> Is Initial View Controller

にチェックマークを付ける

これでDetailViewControllerがInitial View Controllerになった

その後、遷移させたいところで以下を記述


transition.swift

let sb = UIStoryboard(name: "Detail", bundle: nil)

let vc = sb.instantiateInitialViewController("detail") as! DetailViewController
vc.detail = image

// navigationControllerを残してpushで遷移
self?.navigationController?.pushViewController(vc, animated: true)

// modal presentを使って画面ごと遷移
vc.modalTransitionStyle = .flipHorizontal // オプション
self?.present(vc, animated: true, completion: nil)



最終的には


VC.swift

 // タップした時(画像を選択した時)の記述

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let asset: PHAsset = self.photos[indexPath.item]
let width = collectionView.bounds.size.width * 2
let height = collectionView.bounds.size.height * 2

let option = PHImageRequestOptions()
option.deliveryMode = .highQualityFormat

manager.requestImage(for: asset,
targetSize: CGSize(width: width, height: height),
contentMode: .default,
options: option,
resultHandler: {[weak self] result, info in
if let image = result {

// ココの箇所
let sb = UIStoryboard(name: "Detail", bundle: nil)
let vc = sb.instantiateInitialViewController() as! DetailViewController //ViewController が Detail.storyboard の Initial View Controller に設定されていれば、コントローラ名の明記は不要。
vc.detail = image
self?.navigationController?.pushViewController(vc, animated: true)

//modal;
// vc.modalTransitionStyle = .flipHorizontal
// self?.present(vc, animated: true, completion: nil)

}
})
}



DetailViewController.swift

@IBOutlet weak var imageView: UIImageView!

var detail: UIImage!

override func viewDidLoad() {
super.viewDidLoad()

imageView.image = detail
imageView.contentMode = UIViewContentMode.scaleAspectFit
}



前の画面に戻る方法


前の画面に戻る.swift

self.dismissViewControllerAnimated(true, completion: nil)