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를 처음 사용하는 지점을 무시하는 슈퍼 클래스에서 메서드를 호출 할 필요가있다.
이것을 달성하는 좋은 방법이 있습니까? 튜토리얼/블로그에서 이와 같은 예제를 찾을 수 없습니다.
모든 ViewController에서 호출되도록하려면 서브 클래 싱이 최상의 솔루션이라고 – h345k34cr
확장은 클래스에 추가 기능을 추가하지만 객체가 해당 기능을 사용하도록 만들지 않습니다. 상속 된 동작을 재정의 할 수 있도록 수동으로 호출하거나 기존의 서브 클래 싱을 사용해야합니다. ViewController 인스턴스가 한 번만로드되지만 여러 번 표시 될 수 있으므로 viewWillAppear가 더 좋은보고 지점이 될 수도 있습니다. – Paulw11
viewWillAppear에서 호출하지 않는 실수는 실수입니다. 나는 이것을 따르려고 노력하고 있었다 : http://krakendev.io/blog/subclassing-can-suck-and-heres-why 그러나 첫번째 장애물에서 풀렸다. 필자가 필요한 기능을 갖춘 꾸미기 클래스가 좋은 접근 방법 인 것처럼 자동으로 호출 할 수 있다면 이상적이었을 것입니다. 이것을 위해 서브 클래 싱을 피하려고 노력했다. –