【问题标题】: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()

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

【问题讨论】:

标签: ios swift


【解决方案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";
        }
    
        //.......
    } 
    

    【讨论】:

    • 我正在从另一个像 stackoverflow.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()
    

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2014-01-18
      相关资源
      最近更新 更多