2016-08-04 4 views
1

У меня есть два контроллера вида. У меня есть один тестовый метод в первом контроллере представления, как следовать
Неустранимая ошибка при вызове метода из другого класса

class ViewController: UIViewController { 

    @IBOutlet weak var myLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     myLabel.hidden = true 

    } 

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

    func showLabel(){ 
     myLabel.hidden = false 
    } 

} 

Если я называю showLabel из другого класса, она дает мне fatal error: unexpectedly found nil while unwrapping an Optional value

Другой ViewController как следовать

class SecondViewController: UIViewController { 

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

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

    @IBAction func Save(sender: AnyObject) { 
     ViewController().showLabel() 
    } 
} 

Если я называю showLabel Method из ViewController работает отлично, но если я его вызову из SecondViewController, то я получил ошибку.

ответ

0

Оба контроллера вашего вида используют раскадровку/xib; когда вы создаете такой экземпляр контроллера вида в коде (как вы это делаете в функции Save), вам нужно использовать класс UINib или instantiateViewControllerWithIdentifier класса UIStoryboard, поскольку инициализаторы по умолчанию (например, init(), используемые вами для) ничего не знают о продуктах и ​​связанных файлах раскадровки/xib (выходное свойство myLabel всегда будет ноль).

Если ваш код не только шаблон, то вы должны реорганизовать его, потому что исполнительское изменения пользовательского интерфейса с точки зрения контроллера, не представленные на экране (и не будет) не имеет смысла

+0

Можете ли вы показать мне, как я могу это сделать? –

+0

Тема @DivyeshSavaliya слишком широка, вот почему я ответил только на вопрос в заголовке. Я предлагаю вам прочитать это руководство https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/ –

0

Вы должны использовать делегирование:
1 -Добавить делегата в вашем SecondViewController с типом первого контроллера представления ViewController

class SecondViewController: UIViewController { 
    var delegate: ViewController? // add delegate 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

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

    @IBAction func Save(sender: AnyObject) { 
     delegate!.showLabel() // call the method from delegate 
    } 
} 

2-Set делегата в prepareForSegue:

class ViewController: UIViewController { 

    @IBOutlet weak var myLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     myLabel.hidden = true 

    } 

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

    func showLabel(){ 
     myLabel.hidden = false 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let viewController = segue.destinationViewController as? SecondViewController { 
      viewController.delegate = self 
     } 
    } 

} 
+0

Тем не менее, он дает мне то же самое –

-1

просто добавить класс, прежде чем функции:

class Math{ 

    class func addition(numberOne: Int, numberTwo: Int) -> Int{ 

     var ans: Int = numberOne + numberTwo 
     return ans 
    } 
} 

Тогда вы можете вызвать его из другого Swift класса, как это:

Math.addition(40, numberTwo: 2) 

Чтобы присвоить его переменной I:

let i = Math.addition(40, numberTwo: 2) // -> 42 
0

Это потому, что ваш ярлык «myLabel» всегда равен нулю. Ваш ярлык является частью вашего первого ViewController. Метка загружается при загрузке представления. Поскольку представление ViewController не загружено, метка также не загружена, и, следовательно, будет nil

+0

, что это за решение? –

+0

Ваш второй контроль - начальный viewController? –

+0

Нет, initial viewController –

Смежные вопросы