2015-10-21 113 views
3

我想更改另一个viewController的标签。从另一个视图控制器在swift上更改标签

第一个视图控制器是MenuController。第二个是LoginViewController

我想更改MenuController的Label.textLoginViewController

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

不要上传图片的代码。你可以在这里简单的复制和粘贴你的代码。 – Rumin

+0

在这里发布您的代码... –

+0

对不起家伙。我在这里很新。我将学习如何使用Stackoverflow。 –

回答

11

另一种实现方法是使用NSNotificationCenter。打击是,示例:

在你MenuController添加以下代码:你LoginViewController后退按钮的动作看起来就像

func refreshLbl(notification: NSNotification) { 

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

现在:

​​

而且添加这个helper方法:

@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

斯威夫特3版本:

在你MenuController(其中标签需要更改)添加以下代码:

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

而且添加这个helper方法:

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) 
相关问题