2015-10-21 73 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) 
相關問題