2015-06-06 4 views
33

Я не могу добавить метод init к следующему классу UIViewController. Мне нужно написать код в методе init. Должен ли я писать метод init (coder)? Даже когда я добавляю методы кодера и декодера, я все равно получаю ошибки. Я также попытался использовать метод init без каких-либо параметров, но это также не работает.Как написать методы инициализации UIViewController в 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:")) 
    } 

... 
... 
} 

Если я вызываю метод super.init() без параметров ошибки является «Должно назвать назначенный инициализатор класса супер» и если я передаю перо параметров и расслоения, то ошибка «Обязательный инициализатор инициализация (кодировщик)».

Даже когда я добавляю init (coder) и init (декодер), он не работает.

+0

Что такое ошибка? –

+0

вам нужно попробовать init. Я добавил ответ @ankit –

+0

Что именно вы хотите добавить в свой 'init()'? Если это просто жест нажатия, вы можете сделать это и в 'viewDidLoad()', или даже сделать его ленивым var. – Eendje

ответ

4

Я думаю, вы должны добавить

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

или

convenience init() { 
    self.init() 
} 

Вы должны написать инициализации тоже. Не удаляйте его

var tap: UITapGestureRecognizer? 

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

Надеется, что это помогает

+3

Это приводит к ошибке «Должен вызывать назначенный инициализатор суперкласса» –

6

Вы можете просто создать удобство инициализатору вместо этого, удобства Инициализаторы не переопределить Init() вместо этого он просто называет это делает вещи проще.

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

Приложение вылетает из-за того, что tap равен нулю, хотя ему присвоено значение в init. –

+0

Вы пытаетесь использовать кран другого класса? – Icaro

+0

tap объявлен в том же классе .. точно так же, как ваш код. –

37

Я использовал:

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

Некоторые люди предложили:

convenience init(){ 
    self.init() 
} 

Но это дает вам бесконечный цикл.

+1

Это должен быть правильный ответ. –

+0

Я получаю сообщение об ошибке «Аргумент, переданный для вызова, который не принимает аргументов» в инструкции «self.init (nibName: nil, bundle: nil)». – RenniePet

+0

Не вызывается моим контроллером. – Jonny

13

Вы должны переопределить init(nibName:bundle:) инициализатору, и обеспечить init(coder:) необходимую инициализатору и инициализировать tap в обоих из них:

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:")) 
    } 
... 
... 
} 

Кроме того, убедитесь, что при вызове суперкласса инициализатору, что Вы не делаете просто перейдите nil для nibName и bundle. Вы должны передать все, что было передано.

+2

Внутри 'required init (coder aDecoder: NSCoder)', у вас 'super.init()' ... не должно быть 'super.init (coder: aDecoder)'? –

+0

Действительно, в примере кода было два тривиальных опечатка. Вы легко можете увидеть опечатки, используя автозаполнение в Xcode. Роман, если вы видите это, я редактировал опечатки. Естественно, не стесняйтесь меняться или расслабляться. Это единственный правильный ответ, поэтому я исправил опечатки, подбадривал мужчин. – Fattie

12

Все эти ответы являются полу ответами. Некоторые люди испытывают бесконечные циклы в связанных сообщениях, потому что они только добавляют convenience init() (он рекурсивно называет себя, если вы не предоставляете отдельный метод для его вызова), в то время как другие люди пренебрегают расширением суперкласса. Этот формат объединяет все решения, чтобы полностью удовлетворить проблему.

// 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: Кроме того, если вы хотите, чтобы инициализировать все свойства класса, используя параметры, передаваемые в ваш метод convenience init() без всех перекрытых init() методов жалуются, то вы можете установить все эти свойства, неявно распакованное УСТРОЙСТВО, который узор used by Apple themselves.

0

Я столкнулся с этим вопросом о вас, просил длинный путь назад. Но никто не дал основополагающего ответа на вопрос. В Swift это базовый элемент: - Подкласс должен инициализировать свои переменные до того, как будет завершена инициализация суперкласса.

Следовательно, как Ankit Goel упомянул аварии: - "Должен вызвать назначенный инициализатор суперкласса"

Поэтому обновленный код будет: -

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:"))) 
}}