2015-03-13 22 views
32

Więc ja właśnie uaktualniony do Xcode 6.3 Beta 3 i dużo błędów (ów) pojawiają się w odniesieniu do następujących:Initializer nie zastępuje wyznaczony inicjator z nadklasy

Initializer nie nadpisać wyznaczony inicjator ze swojej nadklasy.

override init() { 
    super.init() 
} 

Na przykład jest to UIButton klasa:

class CustomButton: UIButton { 

    var target: AnyObject! 
    var selector: Selector! 
    var action: (() -> Void)! 

    override init() { // Initializer does not override a designated initializer from its superclass 
     super.init() // Must call a designated initializer of the superclass 'UIButton' 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 
} 

Jest to jeden z moich UIViewController klas:

class CustomAlertView: UIViewController { 

    required init(coder aDecoder: NSCoder) { 
     fatalError("NSCoding not supported") 
    } 

    required override init() { // Initializer does not override a designated initializer from its superclass 
     super.init() // Must call a designated initializer of the superclass 'UIViewController' 
    } 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } 
} 

Odpowiedz

39

Moje rozwiązanie jest szybkie, ale uważam, że jest łatwiejsze niż cele firmy Apple w Uwagach do wydania. Aby uzyskać więcej informacji, wyszukaj tutaj 19775924 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf. Apple twierdzi, że tworzysz plik Objective-C i rozszerzasz go (dodając go do plików nagłówkowych i wszystkich) i jest on w "Znanych problemach w Xcode 6.3 beta 3", więc myślę, że łatwo jest zrobić to, co zrobiłem :

ten sposób naprawiłem go UIButton:

class CustomButton : UIButton { 
    init() { 
     super.init(frame: CGRectZero) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

I to jest jeden z moich ViewControllers (usunąć publicznej, jeżeli nie jest to konieczne):

public class GenericViewController: UIViewController { 
    public init() { 
     super.init(nibName: nil, bundle: nil) 
    } 

    required public init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

nie używam tak IB Mam również UIView, ponieważ oddzielam widok od viewController (usunąć publiczny jeśli nie jest to konieczne):

public class GenericMenuView: UIView { 
    public init() { 
     super.init(frame: CGRectZero) 
    } 

    public required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

muszę to specjalnie w widokach bo mam setupViews metodę, która zastąpić wszystkie podklasy, która jest wywoływana na init. I przy użyciu AutoLayout nie potrzebuję żadnych ramek (więc nie nadpisuję init parametrem frame).

Wygląda na to, że musisz upuścić override. O! i nie należy dzwonić pod numer self.init() lub klasa nigdy nie jest inicjowana (i ulega awarii po przekroczeniu limitu czasu wewnętrznego).

1

Niedawno zorientowałem się, i chciałbym wyjaśnij, na czym polegał problem. Oryginalnie odebrano na Apple Developer forums.

Wygląda na to, że Swift zmienił strategię sprawdzania zależności inicjalizatora lub przywracania inicjalizatorów.

Teraz jeśli inicjalizatory są pokazane, jednym ze sposobów radzenia sobie zarówno z Xcode 6.3 Beta 2 i beta 3 jest usunięcie wszystkich definicji initializer:

class CustomButton: UIButton { 

    var target: AnyObject! 
    var selector: Selector! 
    var action: (() -> Void)!  
} 

class CustomAlertView: UIViewController { 

} 

bez definiowania wyznaczone inicjatorów, klasy dziedziczą wszystkie inicjatorów ich nadklas.

Dość łatwa poprawka, ale duża gafa, która sprawiła, że ​​przez chwilę byłem zaskoczony.

3

Zgodnie z dokumentacją Apple here to, co zastępujesz, to inicjator wygody. Tak na Twój initializer do pracy, trzeba będzie zmienić metody

override convenience init() { 
    super.init() 
} 

Można też to zrobić, lub usunąć inicjator jeśli nie są naprawdę korzystali z wyjątkiem wywoływania nadklasę inicjatora.

+0

Tak powinno , zredagowano odpowiedź dla jasności – lostInTransit

3

Myślę, że to jest znacznie łatwiejsze niż się wydaje.

Dla SKSpriteNode, robiłem to:

override init() { 
    let texture = SKTexture(imageNamed: "bgTile") 
    super.init(texture: texture, color: nil, size: texture.size()) 
} 

Problemem jest init() nie jest wyznaczony initializer dla SKSpriteNode. Więc zmieniłem go na:

override init(texture: SKTexture!, color: UIColor!, size: CGSize) { 
    let texture = SKTexture(imageNamed: "bgTile") 
    super.init(texture: texture, color: nil, size: texture.size()) 
} 

Teraz działa dobrze.

1

Rozwiązanie błędu: init Override (koder aDecoder: NSCoder) nie działa tak jak oczekiwano - Swift

Działa to dla mnie, spróbuj tego, Uwaga: u musi obudzić stalówka

override func awakeFromNib() { 

    super.awakeFromNib() 
    // Initialisation code 

}