在swift上从另一个viewcontroller更改标签

Bon*_*n K 5 uilabel ios swift

我想改变另一个标签viewController.

第一个viewcontroller是MenuController.第二个是LoginViewController.

我想改变MenuController的Label.text距离LoginViewController.

LoginViewController:

let viewController = MenuController()
viewController.changeLabel("logout")
Run Code Online (Sandbox Code Playgroud)

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)
    }
Run Code Online (Sandbox Code Playgroud)

但是会发生错误.

致命错误:在展开Optional值时意外发现nil

我该如何解决?

谢谢你的帮助.

Dha*_*esh 13

实现这一目标的另一种方法是你可以使用NSNotificationCenter.打击就是这样的例子:

在您MenuController添加此代码:

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

还要添加此辅助方法:

func refreshLbl(notification: NSNotification) {

    print("Received Notification")
    lbl.text = "LogOut"
}
Run Code Online (Sandbox Code Playgroud)

现在在您LoginViewController的后退按钮操作将如下所示:

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

现在,当你永远从按后退按钮LoginViewControllerrefreshLbl方法将调用从MenuController.

有关详细信息,请参阅示例.


bal*_*630 5

斯威夫特 3版本:

在您的MenuController(需要更改标签的地方)添加以下代码:

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

还添加这个辅助方法:

@objc func refreshLbl() {
    print("Received Notification")
    lbl.text = "LogOut"
}
Run Code Online (Sandbox Code Playgroud)

现在,您LoginViewController的后退按钮操作将如下所示:

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

现在,每当您从方法中按后退按钮时,LoginViewController就会refreshLbl()MenuController.