第一次破解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的要点。
有没有很好的方法来实现这一目标。我无法在任何教程/博客中找到这样的例子。
答案 0 :(得分:1)
基本上,应用的所有屏幕都会共享一些行为。因此,创建一个名为(例如)BaseViewController的类是合适的,这样所有其他视图控制器都将继承它。 在BaseViewController的viewDidLoad中,您可以调用reportPageViewed()方法。 但是,这种方法使得不需要面向协议的编程。当您需要为没有任何共同点的对象分配相同的行为时,协议非常有用(对于应用程序屏幕不是这种情况)。