如何在类中更改全局变量并在不同的视图控制器中访问?

时间:2016-10-18 06:26:46

标签: ios swift

class A : UIViewController {

var b = B()
...

 override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.isNavigationBarHidden = false

         print("inside view will appear")
         print(b.transferText) // Here showing Goku only
    }


}

和第二课

class B : UIViewController{
var transferText = "Goku"
 ...

 override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.transferText = "vegeta"
    }

}

所以当我点击 UINavigationBar 后退按钮时,基本上我必须将transferText从B类转移到A.任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

使用静态变量来执行此操作

class B : UIViewController{
static var transferText = "Goku"
 override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        B.transferText = "vegeta"
    }

}
中的

使用

print(B.transferText) 

或导航后使用,您可以使用完成处理程序,当导航返回时只需用文本调用该完成块。

答案 1 :(得分:1)

使用委托模式将是一个很好的解决方案,用于将数据从子节点传递到父节点(在您的情况下 - 从B类到A类),因为您说A类具有B类实例并且需要将数据发布回到事件发生时的父母。

1)在B类中声明一个协议。

import UIKit
protocol ClassBDelegate
{
    func didUpdate(strTransferText : String)
}    
class B: UIViewController
{
    // Should have valid connection from your Interface builder to this function.
    @IBAction func navBarBtnUpdateClickked(_ sender: AnyObject)
    {
        // on Navigation bar click,Update transferText and fire the delegate again.
        transferText = "Updated Goku by navigation bar button tap"
        didTapNavigationbarButton();
    }
    var transferText = "Goku" // Default.
    var delegate : ClassBDelegate? // Declare a public variable to store delegate.
    override func viewDidLoad()
    {
        super.viewDidLoad()
    }
    override func viewWillAppear(_ animated: Bool)
    {
        super.viewWillAppear(animated)
        // Update transferText and fire delegate.
        transferText = "Updated Goku by navigation bar button tap"
        didTapNavigationbarButton(); // fire delegate from ViewWill appear.
    }
    private func didTapNavigationbarButton() -> Void
    {
        // Need to notify Instance of A class from here.
        // Using Delegation pattern!
        if(delegate != nil)
        {
            delegate!.didUpdate(strTransferText: transferText);
        }
     }

}

2)在A类中确认ClassBDelegate并实现委托。

// Confirming to ClassB Delegate
class A: UIViewController,ClassBDelegate 
{
    var b : B?
    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Setup a segue in storyboard to move from class A to Class B to get class B Instance.
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        b = segue.destination as? B
        b?.delegate = self
        print("inside Prepare for segue function of Class A")
        print(b?.transferText) // Here showing Goku only(Default value).
    }
    internal func didUpdate(strTransferText: String)
    {
        print("Updated transferText in Class B " + strTransferText);
    }
}

3)你去了,只要在B组按下按钮,你就会收到A类实例的回电。

  • 您可以通过Observer模式(NSNotificationCenter)或KVO模式等其他方式实现它,甚至可以使用Singleton模式(始终不适用)。

希望这有助于探索最适合您的要求。

乐意提供帮助:)

答案 2 :(得分:0)

在B类中,您声明A类的属性

var a = A()

在B的viewWillDisappear中,把

a.transferText = "vegeta" 

(你在A类中声明了属性transferText)。