如果在Class中创建了对象,如何在B类中观察?
How to observe in ClassB if an object is created in ClassA?
我的对象:
//Object to observe
struct Text {
let savedUserHeader: String
let savedUserText: String
}
ClassA
我创建对象的地方:
//First Class
class A {
func somefunc(){
let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
}
}
在classB
中,我想观察是否创建了一个新对象:
//Second Class
class B {
var text: Text? {
didSet{
headerlabel.text = text.savedUserHeader
saveUserLabel.text = text?.savedUserText
}
}
}
代表
可以使用Delegate模式来观察,让我们创建一个名为ADelegate
:
的协议
protocol ADelegate {
func didCreateText(text: Text)
}
然后,在classA中添加一个名为delegate
的变量,并将Text
对象传递给somefunc()
中的didCreateText(text:)
方法:
//First Class
class A {
var delegate: ADelegate?
func somefunc(){
let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
delegate?.didCreateText(text: a)
}
}
接下来,当你在B中创建对象A时,设置a.delegate = self
并实现ADelegate
协议:
//Second Class
class B: ADelegate {
var headerlabel: UILabel!
var saveUserLabel: UILabel!
var a = A()
var text: Text? {
didSet{
headerlabel.text = text?.savedUserHeader
saveUserLabel.text = text?.savedUserText
}
}
init() {
a.delegate = self
}
func didCreateText(text: Text) {
print("savedUserHeader: \(text.savedUserHeader)")
print("savedUserText: \(text.savedUserText)")
}
}
就是这样!当在somefunc()
方法中创建对象Text
时,将调用方法didCreateText(text:)
:
let b = B()
b.a.somefunc()
通知中心
另一个解决方案是 NotificationCenter。让 post 在创建 Text
对象时发出通知:
func somefunc(){
let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
NotificationCenter.default.post(name: Notification.Name("addText"), object: a)
}
并观察 class B:
init() {
NotificationCenter.default.addObserver(self, selector: #selector(observeText(noti:)), name: Notification.Name("addText"), object: nil)
}
@objc func observeText(noti: Notification) {
if let text = noti.object as? Text {
print("savedUserHeader: \(text.savedUserHeader)")
print("savedUserText: \(text.savedUserText)")
}
}
让我们测试一下:
let b = B()
let a = A()
a.somefunc()
您将看到结果:
savedUserHeader: testHeader
savedUserText: testText
我的对象:
//Object to observe
struct Text {
let savedUserHeader: String
let savedUserText: String
}
ClassA
我创建对象的地方:
//First Class
class A {
func somefunc(){
let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
}
}
在classB
中,我想观察是否创建了一个新对象:
//Second Class
class B {
var text: Text? {
didSet{
headerlabel.text = text.savedUserHeader
saveUserLabel.text = text?.savedUserText
}
}
}
代表
可以使用Delegate模式来观察,让我们创建一个名为ADelegate
:
protocol ADelegate {
func didCreateText(text: Text)
}
然后,在classA中添加一个名为delegate
的变量,并将Text
对象传递给somefunc()
中的didCreateText(text:)
方法:
//First Class
class A {
var delegate: ADelegate?
func somefunc(){
let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
delegate?.didCreateText(text: a)
}
}
接下来,当你在B中创建对象A时,设置a.delegate = self
并实现ADelegate
协议:
//Second Class
class B: ADelegate {
var headerlabel: UILabel!
var saveUserLabel: UILabel!
var a = A()
var text: Text? {
didSet{
headerlabel.text = text?.savedUserHeader
saveUserLabel.text = text?.savedUserText
}
}
init() {
a.delegate = self
}
func didCreateText(text: Text) {
print("savedUserHeader: \(text.savedUserHeader)")
print("savedUserText: \(text.savedUserText)")
}
}
就是这样!当在somefunc()
方法中创建对象Text
时,将调用方法didCreateText(text:)
:
let b = B()
b.a.somefunc()
通知中心
另一个解决方案是 NotificationCenter。让 post 在创建 Text
对象时发出通知:
func somefunc(){
let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
NotificationCenter.default.post(name: Notification.Name("addText"), object: a)
}
并观察 class B:
init() {
NotificationCenter.default.addObserver(self, selector: #selector(observeText(noti:)), name: Notification.Name("addText"), object: nil)
}
@objc func observeText(noti: Notification) {
if let text = noti.object as? Text {
print("savedUserHeader: \(text.savedUserHeader)")
print("savedUserText: \(text.savedUserText)")
}
}
让我们测试一下:
let b = B()
let a = A()
a.somefunc()
您将看到结果:
savedUserHeader: testHeader
savedUserText: testText