【问题标题】:Sending data to another controller - Without going to him将数据发送到另一个控制器 - 无需去找他
【发布时间】:2018-03-26 17:36:07
【问题描述】:

我想将数据发送到另一个控制器而不打开它。 Example

主控制器:

override func viewDidLoad() {
   let vc = SecondViewController()
   vc.test = "ABCDFER"
}

第二个控制器:

var test: String

override func viewDidLoad() {
   print(test)
}

怎么做?

【问题讨论】:

  • 创建视图控制器的对象并设置其属性。
  • 我尝试过,但不幸的是它不起作用
  • “我尝试过,但不幸的是它不起作用” - 请发布此代码,我们或许可以提供帮助。
  • 我添加了代码
  • 你有没有展示过你用let vc = SecondViewController()创建的视图控制器?

标签: ios swift xcode swift3 controller


【解决方案1】:

这样对我有用

class ViewController: UIViewController {


    var otherViewController: OtherViewController!

    override func viewDidLoad() {
        super.viewDidLoad()
        otherViewController = OtherViewController()
        otherViewController.test = "ABCDFER"
    }

    @IBAction func press() {
        self.show(self.otherViewController, sender: nil)
    }

}

class OtherViewController: UIViewController {


    var test: String!

    override func viewDidLoad() {
        super.viewDidLoad()
        print(test)
    }
}

【讨论】:

    【解决方案2】:

    在您的Main 控制器中,一旦viewDidLoad() 完成您的SecondViewController 实例就会被销毁/释放。如果您想在此时设置一个值 inSecondViewController,以便以后“使用”它,则需要保留对该实例的引用:

    所以,在主控制器中:

    var secondVC: SecondViewController?
    
    override func viewDidLoad() {
       secondVC = SecondViewController()
       secondVC.test = "ABCDFER"
    }
    

    现在,稍后 - 也许在一个按钮点击 - 你想使用那个 same 实例:

    @IBAction func buttonTap(_ sender: Any) {
        print("test in secondVC:", secondVC?.test)
    }
    

    【讨论】:

      【解决方案3】:

      请记住视图生命周期,如果视图 viewDidLoad() 仅在通过 xib 加载视图或使用控制器完成视图相关操作时执行,例如 addSubview()。

      该值正在传递,并且在您的主控制器处于活动状态时不会被释放。

      您可以强制调用生命周期事件,但完全不推荐。

      class ViewController: UIViewController {
          var otherViewController: OtherViewController!
      
          override func viewDidLoad() {
              super.viewDidLoad()
              otherViewController = OtherViewController()
              otherViewController.test = "ABCDFER"
              //Do not do this
              otherViewController.viewDidLoad()
          }
      

      }

      class OtherViewController: UIViewController {
          var test: String!
      
          override func viewDidLoad() {
              super.viewDidLoad()
              print(test)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多