2017-08-31 3 views
0

このシナリオは、プロトコルを確認したビューコントローラ(以下:WorldViewController)で、プロトコルはポップオーバーコンテンツビューコントローラ。汎用プロトコルを使用して、プロトコルを確認する1つのビューコントローラに異なる関連値を持たせる方法

ビューコントローラー(WorldViewController)に2つの異なるポップオーバーコンテンツビューコントローラー(TablePopoverContentVCTextFieldPopoverContentVCと言う)をポップオーバーできます。

しかし、このプロトコルでは、ビューコントローラの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 

} 
} 

答えて

0

私は以下のアプローチを使用していますが、これが最善の方法です。

protocol ShowPopoverProtocol { 
func showPopover<Content: PopoverBaseContent, Target>(contentVc:Content, on target: Target, preferredWidth: CGFloat, arrowDirection: UIPopoverArrowDirection) 
} 

代わりassociated typegeneric functionを使用。

関連する問題