访问从另一个类调用的函数中的变量

Posted

技术标签:

【中文标题】访问从另一个类调用的函数中的变量【英文标题】:Access variable in a function which is called from another class 【发布时间】:2017-04-18 07:19:31 【问题描述】:

我有一个 class1,它有很多变量,并且在 class1 中也有一个函数。我正在从另一个类 class2 调用该函数。触发的函数但我无法访问 class1 的变量。

这里是示例代码

class ViewController: UIViewController 

   var Flat:String?
    var Flong:String?
    var Tlat:String?
    var Tlong:String?
    override func viewDidLoad() 
        super.viewDidLoad()

     Flat = "flat value";
    Flong="flong value";
    Tlat="Tlat value";
    Tlong="tlong value";

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    func calculation()
    
       print("origin_lat new\(Flat)")
        print("origin_lng new\(Flong)")
        print("dest_lat new\(Tlat)")
        print("dest_lng new\(Tlong)")
    


我正在从另一个类Collectionviewcell点击函数调用计算方法

var mycontroller : ViewController = ViewController()

  mycontroller.calculation()

为什么我无法访问任何人帮助我的价值观?

【问题讨论】:

***.com/questions/24072766/… 尝试使用协议。 【参考方案1】:

您还可以通过像这样定义全局变量来访问其他控制器的变量:

class Class1ViewController: UIViewController 
    struct GlobalVariables
        static var Flat:String?
        static var Flong:String?
        static var Tlat:String?
        static var Tlong:String?
    

    override func viewDidLoad() 
        super.viewDidLoad()
        Flat = "flat value";
        Flong="flong value";
        Tlat="Tlat value";
        Tlong="tlong value";
    
  ...

您可以在另一个视图控制器中使用这些变量:

class Class2ViewController: UIViewController 

 ...
    print(Class1ViewController.GlobalVariables.Flat)
    print(Class1ViewController.GlobalVariables.Flong)
    print(Class1ViewController.GlobalVariables.Tlat)
    print(Class1ViewController.GlobalVariables.Tlong)
 ...

【讨论】:

【参考方案2】:

实际上,“viewDidLoad()”函数并没有被调用。它会在您显示 viewController 时调用,例如 UINavigationController 推送它。在您的情况下,您只是创建了 viewController,而不是显示它。如果你想在不显示 viewController 的情况下初始化这些变量,你需要这样做:

class ViewController: UIViewController 

    var Flat:String?
    var Flong:String?
    var Tlat:String?
    var Tlong:String?

    required init?(coder:NSCoder) 
        super.init(coder:coder)
        self.customInit()
    

    override init(nibName: String?, bundle: Bundle?) 
        super.init(nibName: nibName, bundle: bundle)
        self.customInit()
    

    func customInit() 
        Flat = "flat value";
        Flong="flong value";
        Tlat="Tlat value";
        Tlong="tlong value";
    

    //.......
 

【讨论】:

我正在从另一个像 ***.com/questions/24222640/… 这样的视图控制器中获取价值。所以我只能通过 Viewdidload() 获取价值 一旦你调用了"[self presentViewController:...",viewDidLoad()函数就会被调用,然后变量就可以被初始化了。你在句子“[self presentViewController:...”之后调用了calculation()。【参考方案3】:

您试图实现的是一种模型类。我建议你创建一个简单的模型类,它不是 UIViewcontroller 的子类。

class Model: NSObject 
   var fLat: String?
   var fLong: String?
   var tLat: String?
   var tLong: String?

override init() 
    super.init()

    fLat = "flat value"
    fLong = "flong value"
    tLat = "tlat value"
    tLong = "tlong value";




// for print I have forced unwrapped so remember to check before force unwrapping smi)e
func calculation() 
    print("orgin_lat new\(fLat!)")
    print("origin_lng new\(fLong!)")
    print("origin_lat new\(tLat!)")
    print("origin_lng new \(tLong!)")
  



现在在您的主视图控制器中,您可以像这样初始化和调用函数

let model = Model()
model.calculation()

【讨论】:

以上是关于访问从另一个类调用的函数中的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类中的一个类调用 setter 函数?

Python 3从另一个函数更改函数中的变量

为啥我的 kivy 程序没有从另一个类调用函数?

在破坏调用期间从另一个线程未定义的行为调用对象上的方法?

为啥我的 java 函数没有从另一个类的输出调用?

调用从另一个类传递的回调