2

我第一次破解 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 的意义。

有没有一个很好的方法来实现这一点。我在任何教程/博客中都找不到这样的例子。

4

1 回答 1

1

基本上,您的应用程序的所有屏幕总是会共享一些行为。因此创建一个名为(例如)BaseViewController 的类是合适的,这样所有其他视图控制器都将从它继承。在 BaseViewController 的 viewDidLoad 中,您可以调用 reportPageViewed() 方法。但是,这种方法使得不需要面向协议的编程。当您需要将一些相同的行为分配给没有共同点的对象时(应用程序屏幕不是这种情况),协议很有用。

于 2016-08-23T14:13:00.613 回答