Я хочу сменить ярлык с другого viewController.

Первый контроллер просмотра - MenuController. Второй - LoginViewController.

Я хочу изменить Label.text MenuController с LoginViewController.

В LoginViewController:

let viewController = MenuController()
viewController.changeLabel("logout")

В MenuController:

class MenuController: UITableViewController {
    var attractionImages = [String]()
    var attractionNames = [String]()
    var webAddresses = [String]()

    @IBOutlet weak var loginLabel: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()

        loginLabel.text = "Login"
        print(loginLabel.text)

    }

    func changeLabel(Log: String)O {
        self.loginLabel.text = log
        print (log)
    }

Но возникает ошибка.

фатальная ошибка: неожиданно найденное ноль при разворачивании факультативного значения

Как я могу это решить?

Спасибо за вашу помощь.

6
Bon K 21 Окт 2015 в 07:46

2 ответа

Лучший ответ

Другой способ добиться этого - использовать NSNotificationCenter. Удар - тому пример:

В свой MenuController добавьте этот код:

override func viewDidLoad() {
    super.viewDidLoad()
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshLbl:", name: "refresh", object: nil)
}

Также добавьте этот вспомогательный метод:

func refreshLbl(notification: NSNotification) {

    print("Received Notification")
    lbl.text = "LogOut"
}

Теперь в вашем LoginViewController действие кнопки "Назад" будет выглядеть так:

@IBAction func back(sender: AnyObject) {
    NSNotificationCenter.defaultCenter().postNotificationName("refresh", object: nil, userInfo: nil)
    self.dismissViewControllerAnimated(true, completion: nil)
}

Теперь, когда вы когда-либо нажимаете кнопку возврата из LoginViewController, ваш метод refreshLbl будет вызывать из MenuController.

Для получения дополнительной информации см. ЭТО пример.

14
Dharmesh Kheni 21 Окт 2015 в 04:59

Версия Swift 3 :

В свой MenuController (где нужно изменить ярлык) добавьте этот код:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, 
                                           selector: #selector(refreshLbl),
                                           name: NSNotification.Name(rawValue: "refresh"),
                                           object: nil)
}

Также добавьте этот вспомогательный метод:

@objc func refreshLbl() {
    print("Received Notification")
    lbl.text = "LogOut"
}

Теперь в вашем LoginViewController действие кнопки "Назад" будет выглядеть так:

@IBAction func backButton(_ sender: Any) {
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "refresh"), object: nil)
    // Any additional code...
}

Теперь, когда вы когда-либо нажимаете кнопку возврата из LoginViewController, ваш метод refreshLbl() будет вызывать из MenuController.

4
Makwan BK 1 Апр 2020 в 13:27