【问题标题】:Access the same variable before and after value changes in different classes - Swift在不同类中的值更改之前和之后访问相同的变量 - Swift
【发布时间】:2015-09-29 21:45:47
【问题描述】:

我坚持一个简单的概念(我猜),基本上我在 Storyboard 上有两个 ViewController,我也有 2 个类,ViewController 和 ViewController2:

我有一个带有默认值 (0) 的标签,当我单击按钮时,我想将此变量的值更改为 10,然后单击“显示”按钮并打印此变量,我'正在成功更改标签并打印新值。

真正的问题是当我想从另一个视图获取新变量值时,即使我更改了值,如果我尝试在第二个视图上打印变量,变量总是返回默认值(0)

视图控制器

import UIKit

class ViewController: UIViewController {

var variable = "0"
@IBOutlet var defaultLabel: UILabel!
@IBOutlet var label1Label: UILabel!

@IBAction func setValue(sender: AnyObject) {
    setValue()
}


@IBAction func getValue(sender: AnyObject) {
    getValue()
}
override func viewDidLoad() {
    super.viewDidLoad()
}

func setValue(){
    variable = "10"
    defaultLabel.text = variable
}

func getValue(){
    print(variable)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


}

ViewController2

import UIKit

class ViewController2: UIViewController {

@IBOutlet var label2Label: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func show(sender: AnyObject) {
 print(ViewController().getValue())

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}
}

我找到了这篇文章:

Access variable in different class - Swift

我真的认为这是我找到解决方案的方式,但我真的不明白如何在 ViewController2 上调用变量。

谢谢。

【问题讨论】:

    标签: ios xcode swift variables


    【解决方案1】:
    @IBAction func show(sender: AnyObject) { 
        print(ViewController().getValue())
    }
    

    ViewController() - 这是类构造函数,每次调用 ViewController() 它都会返回 ViewController 类的新实例/对象, 当然是默认值。

    如果您从 ViewController 中显示 ViewController2,您可以在 中创建类似于 variable 的属性/变量 variable2 >ViewController 并在显示之前设置值,但在创建 ViewController2 之后。如果您使用 segues,您可以将此代码放在 ViewController 类中:

    // Put this code in ViewController class
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let viewController2 = segue.destinationViewController as? ViewController2
        if viewController2 != nil {
            // you can't set the value for label at this time 
            // because the viewcontroller and all its UI controls aren't loaded
            // but you can set a non UI variable
            viewController2?.variable2 = self.variable 
        }       
    }
    

    之后,您可以在 ViewController2 类的 viewDidLoad 方法中添加一行代码:

    // Put this code in ViewController2 class
    var variable2 = "0"
    @IBOutlet var label2Label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.label2Label.text = variable2
    }
    

    【讨论】:

    • 我想我已经理解了你的建议,问题是我正在使用容器视图,所以 prepareForsegue 在任何交互之前完成,甚至在我设置新变量值之前。但如果我能解决我的问题,我会更多地探索你的逻辑,谢谢。
    【解决方案2】:

    使用委托!

    这是一个示例,其中ViewController1ViewController2 的代表:

    1. 定义一个协议:

      protocol VariableManager {
        func getValue() -> Int
      }
      
    2. 然后,在ViewController1中,修改getValue方法,使ViewController1符合协议:

      class ViewController1: VariableManager {
      
        func getValue() -> String {
         return variable
        }
      
      }
      
    3. 现在在ViewController2 中定义一个名为delegate 的变量:

      class ViewController2 {
        var delegate: VariableManager?
      }
      
    4. ViewController1 中的prepareForSegue 方法中:

      override func prepareForSegue(segue: UIStoryboardSegue) {
      
        if let identifier  = segue.identifier {
      
          switch identifier {
            case "MySegueIdentifier":
              let destination = segue.destinationViewController as! 'ViewController2'
              destination.delegate = self
      
          default:
            break
          }
      
        }
      
      }
      
    5. 现在在ViewController2 中,更改show 方法:

      @IBAction func show(sender: AnyObject) {
        if let delegate = delegate {
          let variable = delegate.getValue()
          print(variable)
      }
      

    委托是一种非常常见且非常重要的模式。我建议你阅读它:https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html

    尝试在ViewController2 中实例化另一个ViewController1 瞬间是不是好的做法。

    【讨论】:

    • 感谢您的回答,它让我更清楚了一点,但我在这一行仍然遇到问题 //destination.delegate = self (cannot assign a value of type 'View Controller ' 到 'VariableManager?' 类型的值)
    • 您可能缺少的行是class ViewController1: VariableManager。您需要指定ViewController 符合VariableManager 协议。
    猜你喜欢
    • 2014-08-11
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2023-03-31
    • 1970-01-01
    • 2012-10-08
    • 2021-08-02
    相关资源
    最近更新 更多