2015-06-06 22 views
33

Nie mogę dodać metody init do następującej klasy UIViewController. Muszę napisać jakiś kod w metodzie init. Czy muszę napisać metodę init (koder)? Nawet gdy dodaję koder i metody dekodera, ciągle dostaję błędy. Próbowałem również używać metody init bez żadnych parametrów, ale to też nie działa.Jak pisać metody init sterownika UIView w Swift

class ViewController: UIViewController { 

    var tap: UITapGestureRecognizer? 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nil, bundle: nil) 
     tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
    } 

... 
... 
} 

Gdybym wywołać metodę super.init() bez parametrów błędu jest „Must call wyznaczony inicjator super klasy”, a jeśli mijam stalówkę parametrów wiązki i następnie błąd jest „niezbędna inicjująca init (koder) ".

Nawet jeśli dodaję init (koder) i init (dekoder), to nie działa.

+0

Jaki jest błąd? –

+0

musisz wypróbować wymagany init. Dodałem @ankit odpowiedź –

+0

Co dokładnie chcesz dodać w swoim 'init()'? Jeśli jest to tylko gest dotykowy, możesz to zrobić również w 'viewDidLoad()', lub nawet sprawić, że będzie leniwym var. – Eendje

Odpowiedz

4

Chyba trzeba dodać

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

lub

convenience init() { 
    self.init() 
} 

Trzeba napisać zbyt Init. Nie je usunąć

var tap: UITapGestureRecognizer? 

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

Nadzieja pomaga

+3

To daje błąd „Must call wyznaczony inicjator o nadrzędnej” –

6

można po prostu stworzyć inicjator spożywczy zamiast inicjalizatory wygoda nie przesłonić init() zamiast po prostu nazywa to co łatwiejsze.

class ViewController: UIViewController { 
    var tap: UITapGestureRecognizer? 
    convenience init(){ 
     self.init() 
     tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
    } 
} 
+0

Aplikacja ulega awarii, ponieważ z kranu jest zerowa, mimo że została przypisana wartość w init. –

+0

czy próbujesz użyć dotknięcia innej klasy? – Icaro

+0

Tap jest zadeklarowany w tej samej klasie .. tak jak twój kod. –

37

użyłem:

convenience init() { 
    self.init(nibName:nil, bundle:nil) 
} 

Niektórzy ludzie zasugerował:

convenience init(){ 
    self.init() 
} 

Ale to daje nieskończoną pętlę.

+1

To powinna być poprawna odpowiedź. –

+0

Dostaję błąd „argument przekazany zadzwonić, że nie wymaga żadnych argumentów” na „self.init (nibName: nil, wiązki: nil)” oświadczenie. – RenniePet

+0

Nie jest wywoływana przez kontroler. – Jonny

13

Trzeba zastąpić init(nibName:bundle:) inicjator, i dostarczyć init(coder:) wymagane inicjator i zainicjować tap w obu z nich:

class ViewController: UIViewController { 

    var tap: UITapGestureRecognizer? 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
     print("init nibName style") 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
     tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
    } 

    // note slightly new syntax for 2017 
    required init?(coder aDecoder: NSCoder) { 
     print("init coder style") 
     super.init(coder: aDecoder) 
     tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
    } 
... 
... 
} 

Należy także pamiętać, gdy dzwoni nadklasę inicjator że ty nie wystarczy podać nil dla nibName i bundle. Powinieneś przekazać wszystko, co zostało przekazane.

+2

Wewnątrz 'wymagane init (koder aDecoder: NSCoder)', 'masz super.init()' ... nie powinno to być 'super.init (koder: aDecoder)'? –

+0

Rzeczywiście w kodzie były dwa trywialne literówki. Możesz łatwo zobaczyć literówki, używając autouzupełniania w Xcode. Roman, jeśli to widzisz, edytowałem literówki. Oczywiście możesz zmienić lub zrelaksować się. To jedyna poprawna odpowiedź, więc naprawiłem literówki, kibicuję mężczyznom. – Fattie

12

Wszystkie te odpowiedzi stanowią połowiczne odpowiedzi. Niektóre osoby doświadczają nieskończonych pętli w powiązanych wpisach, ponieważ dodają tylko convenience init() (rekursywnie wywołują samą siebie, jeśli nie udostępniają innej metody, aby ją wywołać), podczas gdy inne osoby zaniedbują rozszerzenie tej nadklasy. Ten format łączy wszystkie rozwiązania, aby całkowicie rozwiązać problem.

// This allows you to initialise your custom UIViewController without a nib or bundle. 
convenience init() { 
    self.init(nibName:nil, bundle:nil) 
} 

// This extends the superclass. 
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
} 

// This is also necessary when extending the superclass. 
required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") // or see Roman Sausarnes's answer 
} 

Edit: Ponadto, jeśli chcesz zainicjować żadnych właściwości klasy, stosując parametry przekazane do swojego sposobu convenience init() bez wszystkie Zastępowana init() metody skarży, to może ustawić wszystkie te właściwości jako niejawnie rozpakowanego składniki ewentualne, który jest wzór used by Apple themselves.

0

natknąłem to pytanie od Pytałeś długą drogę powrotną. Ale nikt nie dostarczył podstawowej odpowiedzi na to pytanie. Jest to podstawowy w Swift że: - Podklasa musi zainicjować swoje zmienne zanim super inicjalizacji klasy jest kompletna.

Stąd jako Ankit Goel wspomniano katastrofy: - "Trzeba zadzwonić do wyznaczonego inicjator o nadrzędnej"

Stąd zaktualizowany kod byłoby: - ​​

class ViewController: UIViewController { 
var tap: UITapGestureRecognizer? 

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
print("init nibName style") 
self.tap = nil 
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
self.tap = UITapGestureRecognizer(target: self, action: Selector(("handleTap:"))) 
} 

required init?(coder aDecoder: NSCoder) { 
print("init coder style") 
self.tap = nil 
super.init(coder: aDecoder) 
tap = UITapGestureRecognizer(target: self, action: Selector(("handleTap:"))) 
}}