[swift] Install PopoverPresentationController & Reflect Tap Information to MainViewContoller
Tried to install PopoverPresentationController which let small window pop-up
Poped up Window is CollectionViewController
and let CollectionViewController notice Tap information to MainViewController when CollectionViewController Cell tapped
Installed Code is below.
Create delegate on CollectionViewController, then setup this delegate on MainViewContoller

MainViewController
import UIKit
class ViewController: UIViewController,UIPopoverPresentationControllerDelegate,TestCollectionViewControllerDelegate {
@IBOutlet var button:UIButton!
@IBOutlet var testImage:UIImageView!
var testViewController:TestCollectionViewController!
override func viewDidLoad() {
super.viewDidLoad()
}
//on StoryBorad, should setup segue from Button to TestCollectionViewController(ID : popup)
override func prepare(for segue:UIStoryboardSegue,
sender:Any!) {
if let identifier = segue.identifier {
switch identifier {
case "popup":
if let contentVC = segue.destination as? TestCollectionViewController, let button = sender as? UIButton {
//set delegate for tapped
contentVC.delegate = self
//popoverPresentationController
let controller = contentVC.popoverPresentationController
controller?.delegate = self
//background color (mainly arrow)
controller?.backgroundColor = UIColor.gray
//direction of arrow
controller?.permittedArrowDirections = .down
//the object pointed by arrow#1
// controller?.sourceView = button //un-necessary?
//the object pointed by arrow#2
controller?.sourceRect = button.bounds
//display size
contentVC.preferredContentSize=CGSize(width: 400, height: 200)
}
default: break
}
}
}
// for iPhone
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
// Run Delegate
func didChangeBackgroundImage(str:String) {
testImage.image = UIImage(named: "stamp_" + String(str) + ".png")
}
}
CollectionViewContorller
import UIKit
protocol TestCollectionViewControllerDelegate: class {
func didChangeBackgroundImage(str:String)
}
class TestCollectionViewController: UICollectionViewController {
@IBOutlet var myCollectionView : UICollectionView!
weak var delegate: TestCollectionViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
myCollectionView.delegate = self
myCollectionView.dataSource = self
}
// cell number
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 40
}
// cell setting
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TestCell", for: indexPath as IndexPath)
let imageView = cell.contentView.viewWithTag(1) as! UIImageView
imageView.image = UIImage(named: "stamp_" + String(num) + ".png")
return cell
}
// method for tapped
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
self.delegate?.didChangeBackgroundImage(str: String(num))
}
}