2016-06-05 13 views
0

Ich folge dieser post, um eine UIPopoverBackgroundView zu implementieren. Ich überprüfte die UIPopoverBackgroundView Klasse, ich denke, ich habe alle erforderlichen Funktionen und Variablen implementiert, aber der Fehler besteht immer noch beim Ausführen.Fehler: [UIPopoverBackgroundView setArrowOffset:] muss von Unterklassen implementiert werden

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIPopoverBackgroundView setArrowOffset:] must be implemented by subclassers.'

import UIKit 

class CustomPopoverBackground: UIPopoverBackgroundView { 

    override func layoutSubviews() { 
     super.layoutSubviews() 
    } 

    override var arrowOffset: CGFloat { 
     get { 
      return 0.0 
     } 
     set { 
      super.arrowOffset = newValue 
     } 

    } 

    override var arrowDirection: UIPopoverArrowDirection { 
     get { 
      return UIPopoverArrowDirection.Up 
     } 
     set { 
      super.arrowDirection = newValue 
     } 
    } 

    override class func contentViewInsets() -> UIEdgeInsets { 
     return UIEdgeInsetsMake(10, 10, 10, 10) 
    } 

    override class func arrowBase() -> CGFloat { 
     return 2.0 
    } 

    override class func arrowHeight() -> CGFloat { 
     return 2.0 
    } 

} 

Wo habe ich falsch gemacht? Was ist setArrowOffset, ich habe es nicht in der Klasse UIPopoverBackgroundView oder UIPopoverBackgroundViewMethods Protokoll gefunden.

+0

Sie können nicht 'super.arrowOffset = newValue' in Ihrem' arrowOffset' Setter tun. Der Superklassensetter löst diese Ausnahme aus. – dan

+0

@dan Könnten Sie eine Antwort geben, um zu zeigen, was ich stattdessen tun sollte? – luiyezheng

Antwort

0

Ein weiterer Blog post, die tatsächlich die Implementierung von kundenspezifischen zeigt UIPopOverBackgroundView

Sie den Pfeil in einer Struktur hier

private struct Arrow { 
    let height : CGFloat = 30.0 
    let base  : CGFloat = 20.0 

    var direction : Direction = .UP 
    var offset : CGFloat = 0.0 
} 

override var arrowOffset: CGFloat { 
    get { 
     return arrow.offset 
    } 

    set { 
     arrow.offset = newValue 
    } 
} 

Kein Super-Aufruf, die Klasse erwartet Unterklasse tatsächlich hält den Wert und nicht hält die Superklassen-Implementierung.