0
このシナリオは、プロトコルを確認したビューコントローラ(以下:WorldViewController
)で、プロトコルはポップオーバーコンテンツビューコントローラ。汎用プロトコルを使用して、プロトコルを確認する1つのビューコントローラに異なる関連値を持たせる方法
ビューコントローラー(WorldViewController
)に2つの異なるポップオーバーコンテンツビューコントローラー(TablePopoverContentVC
、TextFieldPopoverContentVC
と言う)をポップオーバーできます。
しかし、このプロトコルでは、ビューコントローラの1つのタイプにのみ関連付けることができます。
protocol ShowPopoverProtocol: class {
associatedtype PopoverContentType: PopoverBaseContent
func showPopover(contentVc: PopoverContentType, on target: UIView, preferredWidth: CGFloat)
}
extension ShowPopoverProtocol where Self: UIViewController {
func showPopover(contentVc: PopoverContentType, on target: UIView, preferredWidth: CGFloat) {
guard let popoverPresentation = configurePresentation(from: contentVc, preferredWidth: preferredWidth) else {
return
}
popoverPresentation.sourceView = target
popoverPresentation.sourceRect = target.bounds
self.present(contentVc, animated: true) {
popoverPresentation.passthroughViews = nil
}
}
private func configurePresentation(from contentVC: PopoverContentType, preferredWidth: CGFloat) -> UIPopoverPresentationController? {
let height = contentVC.getHeight()
contentVC.preferredContentSize = CGSize(width: preferredWidth, height: height)
contentVC.modalPresentationStyle = .popover
guard let popOverPresentation = contentVC.popoverPresentationController else {
return nil
}
popOverPresentation.permittedArrowDirections = .up
return popOverPresentation
}
}