SWIFT访问另一个控制器的数据

时间:2016-03-27 09:32:44

标签: ios swift

例如,我有2个控制器已经在内存中(Class 1,Class 2)。如何从Class 2访问Class 1数据?

class Class_1: UIViewController {

    var number:UInt8 = 1

    override func viewDidAppear(animated: Bool) {
        number = 8
    }   
}

如何在Class 2中访问数字变量并打印它?关键是不要创建新实例,重点是在内存中获取Class 1的指针并获取对其数据的访问权限。

1 个答案:

答案 0 :(得分:0)

首先将ViewController的名称从Class_1更改为Class1ViewController,将Class_2更改为Class2ViewController

您需要在 Class1ViewController 中初始化 Class2ViewController 时设置 Class2ViewController 的变量,并将数据从 Class2ViewController 传递回 Class1ViewController 你需要使用委托

对于 Class1ViewController Class2ViewController 的数据传输,打开 Class1ViewController 文件,如果使用的是storyboard,则添加以下prepareForSegue方法

class Class1ViewController: UIViewController{
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Class2ViewController" {
            if let class2ViewController = segue.destinationViewController as? Class2ViewController {
                class2ViewController.inforFromClass1 = "Class 2 Variable set from Class 1"
            }
        }
    }
}

但是,如果您正在使用xib并且有一个按钮可以从 Class1ViewController 移动到 Class2ViewController ,则应该在触发 Class2ViewController的按钮的IBAction中编写以下代码

class Class1ViewController: UIViewController{
    @IBAction showClass2ViewController(){
    let secondViewController = SecondViewController(nibName:"SecondViewController", bundle: NSBundle.mainBundle())
    secondViewController.infoFromClass1 = "Class 2 Variable set from Class 1"
    self.showViewController(secondViewController, sender: self)
   }
}

这是在 Class2ViewController 上设置变量的方法,同时从 Class1ViewController

显示变量

现在要将消息从 Class2ViewController 传递到 Class1ViewController ,您需要使用委托。打开 Class2ViewController 并在顶部添加以下协议

@objc protocol Class2ViewContollerDelegate :class{
   func printMessageFromClass2ViewController()
}

class Class2ViewController: UIViewController {   
}

Class2ViewController 类中添加对delagate的弱引用,并在其ViewDidAppear或您喜欢的任何其他方法中调用它,

@objc protocol Class2ViewContollerDelegate :class{
   func printMessageFromClass2ViewController()
}

class Class2ViewController: UIViewController {
   weak var delegate: Class2ViewControllerDelegate?
   override func viewDidAppear(animated: Bool) {
        self.delegate?.printValueFromClass2ViewController
   }   
}

现在我们已经在 Class2ViewController 中定义了协议,我们需要在 Class1ViewController 中实现它。返回 Class1ViewController 文件,实现类似协议

class Class1ViewController: UIViewController, Class2ViewControllerDelegate {
    func printMessageFromClass2ViewController(){
        print("hey I just printed message in Class1ViewController through its delegate in Class2ViewController")
    }

    // For Xibs
    @IBAction showClass2ViewController(){
        let secondViewController = SecondViewController(nibName: "SecondViewController", bundle: NSBundle.mainBundle())
        secondViewController.infoFromClass1 = "Class 2 Variable set from Class 1"
        self.showViewController(secondViewController, sender: self)
    }

    //  For storyboards
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Class2ViewController" {
            if let class2ViewController = segue.destinationViewController as?Class2ViewController {
                class2ViewController.inforFromClass1 = "Class 2 Variable set from Class 1"
            }
        }
    }
}