单击导航控制器时更新文本的值

时间:2015-11-27 08:51:47

标签: ios xcode swift swift2

我有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)
    }

4 个答案:

答案 0 :(得分:2)

From

您需要使用委托。以下是如何在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)
}