【问题标题】:How to change variable value declared in a class from another class?如何从另一个类更改一个类中声明的变量值?
【发布时间】:2019-06-06 06:37:04
【问题描述】:

我有 2 个视图控制器,在 vC1 中声明了一个变量 isShowListAsked : Bool = false,单击地图按钮时它转到 vC2。在 vC2 中有一个名为 List 的按钮。 我要那个 : 单击 List 按钮后,它会返回到 vC1,并且 vC1 变量值应更改为 true。但它仍然是 False。

请帮帮我。

提前致谢。

点击 List 按钮后,我可以返回 vC1 但无法设置 isShowListAsked = true 。我试过 get{} set {}。

在 vC1 中:

class vC1 : UIViewController
 {
var isShowListAsked : Bool = false

    var IsShowListAsked : Bool {
        get {
            return isShowListAsked
        }
        set{
            isShowListAsked = newValue
        }
    }
}

然后点击 In vC2 后:

class vC2 : UIViewController 
{
var vc = vC1()

 @IBAction func mapListSegmentTapped(_ sender: Any) {

       if mapListSegment.selectedSegmentIndex == 1 
     {
       vc.IsShowListAsked = true

        }
        if mapListSegment.selectedSegmentIndex == 0 
      {
            vc.IsShowListAsked = false
        }
   }
}

返回后,我在 viewWillappear() 中检查变量值

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

      print(" isshowListAsked = \(IsShowListAsked) ") // print false
   }

预期结果:

print(" isshowListAsked = \(IsShowListAsked) ") // print True

实际结果:

print(" isshowListAsked = \(IsShowListAsked) ") // print false

【问题讨论】:

  • 只使用委托协议。
  • 问题是你正在创建一个新的 VC1 实例,你需要在你来自的实例上设置值。使用委托。

标签: swift get set


【解决方案1】:

使用 Closures 解决您的问题陈述。

((Bool)->())? 类型的VC2 中创建一个closure,并在mapListSegmentTapped(_:) 方法中使用相关的true/false 值调用它,即

class VC2: UIViewController {
    var handler: ((Bool)->())?

    @IBAction func mapListSegmentTapped(_ sender: Any) {
        if mapListSegment.selectedSegmentIndex == 1 {
            self.handler?(true)
        } else if mapListSegment.selectedSegmentIndex == 0 {
            self.handler?(false)
        }
    }
}

现在,当你是 presenting 时设置这个 closure instance 来自 VC2VC1

class VC1 : UIViewController {
    var isShowListAsked: Bool = false

    func onTapMapButton(_ sender: UIButton) {
        if let controller = self.storyboard?.instantiateViewController(withIdentifier: "VC2") as? VC2 {
            controller.handler = {[weak self] (value) in
                self?.isShowListAsked = value
                print(self?.isShowListAsked) 
            }
            self.present(controller, animated: true, completion: nil)
        }
    }
}

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 2023-04-11
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多