我有2个控制器
并且有一个全局变量,问题是如果我转到控制器2并单击按钮northAmericaClick,它将导航回控件1,但全局变量的值不会改变!
这是我的代码
控制器1
class OurViewController: UIViewController {
@IBOutlet weak var menuButton: UIBarButtonItem!
@IBOutlet weak var selectedServer: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
selectedServer.setTitle(selected server, forState: UIControlState.Normal) // selected server this is global variable
}
控制器2
class selectServerController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func northAmericaClick(sender: AnyObject) {
selectedserver = "North America"
self.navigationController?.popViewControllerAnimated(true)
}
答案 0 :(得分:2)
您需要使用委托。以下是如何在Swift中使用委托的示例。
在第一个ViewController上,在加载第二个VC时设置代理:
例如,如果您使用的是Storyboard编辑器:
var secondViewController = (segue.destinationViewController.visibleViewController as MySecondViewControllerClass)
secondViewController.delegate = self
编写一个协议并定义一个函数来重写你的值
例如,创建一个名为" Protocol.swift"的文件。并写下这样的东西:
protocol writeValueBackDelegate {
func writeValueBack(value: String)
}
将函数添加到FirstViewController
func writeValueBack(value: String) {
// this is my value from my second View Controller
}
到你的ViewControllerClass
class ViewController: UIViewController, writeValueBackDelegate
转到第二个视图控制器,并在此处添加代理:
class SecondViewController: ViewController {
// delegate for FirstViewController
var delegate: writeValueBackDelegate?
在第二个视图控制器上,您现在可以使用它来在第一个视图控制器中调用func传递数据。
delegate?.writeValueBack("That is a value")
您还需要指明您的第一个视图控制器实现协议:class ViewController:UIViewController,writeValueBackDelegate {
答案 1 :(得分:0)
使用委托执行此操作的一部分您还可以创建单例类ViewControllersDataModel类并使用它共享变量:
import Foundation
class ViewControllersDataModel {
static let sharedInstance = ViewControllersDataModel()
var selectedserver: String = ""
private init() {
}
}
并称之为:
ViewControllersDataModel.sharedInstance.selectedserver = "Selected Option";
答案 2 :(得分:0)
好的,我可以使用此代码执行此操作,仅检查viewWillDisapear并在navicationController中调用此视图控制器的父级:
override func viewWillDisappear(animated: Bool) {
if ((self.navigationController!.viewControllers.last?.isKindOfClass(ActivityMyViewController)) == true){
let backView:MyViewController = self.navigationController!.viewControllers.last as! MyDetailViewController
backView // do whatever you want
}
}
我希望这段代码可以帮到你,祝你好运
答案 3 :(得分:0)
感谢各位帮忙;)
非常简单
我只是在它回归时使用^^"
override func viewWillAppear(animated: Bool) {
selectedServer.setTitle(selectedserv, forState: UIControlState.Normal)
}