2016-08-23 2 views
2

POP에서 첫 번째 균열이 있습니다. 이 경우 일부 UIViewControllers를 꾸미기 때문에 자동으로 '페이지 조회'분석 이벤트가 발생합니다.프로토콜 지향 프로그래밍, 암시 적으로 확장 메서드 호출

그래서 나는 프로토콜을 작성하고, 그 프로토콜에 대한 확장 :

class HomeView: UIViewController, ReportPageViewedEvent { 

내가 얻을 :

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에 장식하면 내가 원하는대로 작동 컴파일러 오류 내가 정확히 내가 원하는 'pageName'을 설정하지 않으면.

나는 어디에서 어떻게 실제로 어떻게 reportPageViewed() 메서드를 호출됩니다. 난 정말 viewDidLoad에서 전화를 원한다는 의미 중 하나를 사용하여 모든 'viewDidLoad'그것을 사용하는 모든 컨트롤러에서, 또는 하위 클래스 및 POP를 처음 사용하는 지점을 무시하는 슈퍼 클래스에서 메서드를 호출 할 필요가있다.

이것을 달성하는 좋은 방법이 있습니까? 튜토리얼/블로그에서 이와 같은 예제를 찾을 수 없습니다.

+1

모든 ViewController에서 호출되도록하려면 서브 클래 싱이 최상의 솔루션이라고 – h345k34cr

+1

확장은 클래스에 추가 기능을 추가하지만 객체가 해당 기능을 사용하도록 만들지 않습니다. 상속 된 동작을 재정의 할 수 있도록 수동으로 호출하거나 기존의 서브 클래 싱을 사용해야합니다. ViewController 인스턴스가 한 번만로드되지만 여러 번 표시 될 수 있으므로 viewWillAppear가 더 좋은보고 지점이 될 수도 있습니다. – Paulw11

+0

viewWillAppear에서 호출하지 않는 실수는 실수입니다. 나는 이것을 따르려고 노력하고 있었다 : http://krakendev.io/blog/subclassing-can-suck-and-heres-why 그러나 첫번째 장애물에서 풀렸다. 필자가 필요한 기능을 갖춘 꾸미기 클래스가 좋은 접근 방법 인 것처럼 자동으로 호출 할 수 있다면 이상적이었을 것입니다. 이것을 위해 서브 클래 싱을 피하려고 노력했다. –

답변

1

기본적으로 앱의 모든 화면에서 공유되는 동작이 있습니다. 따라서 (예를 들어) BaseViewController라는 클래스를 생성하여 다른 모든 뷰 컨트롤러가 상속받을 수 있도록하는 것이 적절합니다. BaseViewController의 viewDidLoad에서 reportPageViewed() 메서드를 호출 할 수 있습니다. 그러나이 방법을 사용하면 프로토콜 지향 프로그래밍이 필요하지 않습니다. 프로토콜은 공통점이없는 객체에 동일한 비헤이비어를 할당해야 할 때 유용합니다 (앱 화면에서는 그렇지 않음).