我第一次破解 POP。在这种情况下,我想装饰一些 UIViewControllers,以便它们自动引发“页面查看”分析事件。
所以我创建了一个协议,以及该协议的扩展:
protocol ReportPageViewedEvent {
func reportPageViewed()
var pageName : String? { get set }
}
extension ReportPageViewedEvent where Self: UIViewController
{
func reportPageViewed()
{
guard let pageName = self.pageName else
{
fatalError("UIViewController implements ReportPageViewEvent protocol but did not set pageName property")
}
let eventBusiness = EventBusiness.sharedInstance
eventBusiness.logUserViewedPage(pageName)
}
}
如果我用ReportPageViewedEvent
这样的方式装饰 UIViewController,这可以按我的意愿工作:
class HomeView: UIViewController, ReportPageViewedEvent {
除非我设置了我想要的“pageName”,否则我会收到编译器错误。
我陷入困境的地方是在哪里以及如何调用实际reportPageViewed()
方法。我真的希望它被调用,viewDidLoad
这意味着我要么必须修改每个使用它的控制器中的每个“viewDidLoad”,要么子类化并调用超类中的方法,这首先违背了使用 POP 的意义。
有没有一个很好的方法来实现这一点。我在任何教程/博客中都找不到这样的例子。