2015-10-21 5 views
3

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

Первый контрольный контроллер - 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) 
    } 

Но ошибка происходит.

fatal error: unexpectedly found nil while unwrapping an Optional value

Как его решить?

Благодарим за помощь.

+2

Dont загружать изображения для кода. Вы можете просто скопировать и вставить свой код здесь. – Rumin

+0

Отправьте код здесь ... –

+0

Извините, ребята. Im очень новый здесь. Я собираюсь узнать, как использовать Stackoverflow. –

ответ

11

Другой способ достижения этого - вы можете использовать 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.

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

+1

Спасибо Dharmesh !!!! Он работает очень хорошо. :) –

3

Swift 3 версия:

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

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

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

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.

Кроме того, если вы создаете новый быстрый файл, скажем: Constants.swift:

import Cocoa 

let LABEL_REFRESH = NSNotification.Name("refresh") 

Затем вы можете сократить код:

NotificationCenter.default.post(name: LABEL_REFRESH, object: nil) 
NotificationCenter.default.addObserver(self, selector: #selector(refreshLbl), name: LABEL_REFRESH, object: nil) 
Смежные вопросы