ios - 使用通用协议(protocol),如何在一个 View Controller 中具有不同的关联值来确认协议(protocol)

标签 ios swift generics protocols

场景是:在确认协议(protocol)(如下所示)的 View Controller (例如:WorldViewController)中,该协议(protocol)用于弹出内容 View Controller 。

我希望它可以在 View Controller (WorldViewController) 中弹出 2 个不同的弹出内容 View Controller (例如 TablePopoverContentVCTextFieldPopoverContentVC)。

但是通过这个协议(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/

相关文章:

objective-c - -initWithContentsOfFile : for an NSMutableArray

arrays - 在 cellForRowAtIndexPath Swift 中将 Int Array 格式化为 String

swift - 如何将颜色 Sprite 调用到某个位置(Swift 3)

c# - 给定两个泛型类型变量,我如何编译一个 system.linq.expression 树来将它们相乘?

c# - 如何创建从实现接口(interface)的基类派生的实例列表?

ios - 当应用程序进入后台时 AVAudioPlayer 不播放

javascript - 从 WKWebView 中的 native 代码调用 JavaScript 函数

ios - iOS TestFlight版本更新为AppStore版本

ios - 在 iOS8/Swift 中为 UIDatePicker 设置文本颜色和字体

swift - 泛型和协议(protocol)类型的功能参数在实践中有什么区别?