例如,我有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的指针并获取对其数据的访问权限。
答案 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"
}
}
}
}