场景是:在确认协议(protocol)(如下所示)的 View Controller (例如:WorldViewController
)中,该协议(protocol)用于弹出内容 View Controller 。
我希望它可以在 View Controller (WorldViewController
) 中弹出 2 个不同的弹出内容 View Controller (例如 TablePopoverContentVC
、TextFieldPopoverContentVC
)。
但是通过这个协议(protocol),我只能关联到 View Controller 中的一种类型。
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
}
}
最佳答案
我使用以下方法,但不确定这是最好的方法。
protocol ShowPopoverProtocol {
func showPopover<Content: PopoverBaseContent, Target>(contentVc:Content, on target: Target, preferredWidth: CGFloat, arrowDirection: UIPopoverArrowDirection)
}
使用泛型函数
而不是关联类型
。
关于ios - 使用通用协议(protocol),如何在一个 View Controller 中具有不同的关联值来确认协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45973904/