如何将从一个类委派的值更新到另一个类?



我在委派方面遇到了问题。我对这个概念比较陌生,但从概念上讲,我明白了,它很重要。我只是在使用它时遇到问题。我似乎无法将数据从一个类传递到另一个类。我知道在堆栈溢出方面存在现有的委派示例,但它们并没有完全反映我的误解。我可以使用协议、委托并在课堂上调用它。我相信我错过了一些细微差别......这在我的代码中缺乏功能中可见一斑

//my protocol:
protocol StingHolder {
func StringPasser(ThisText text: String)
}

创建委托协议关系,放置要传递的数据,然后关闭视图控制器


// my classes for placing data to be passed
class changeLabel: UIViewController,UITextFieldDelegate{
var Delegate: StingHolder?

@IBOutlet weak var TexrBeingPassed: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
TexrBeingPassed.delegate = self
// Do any additional setup after loading the view.
}

@IBAction func ButtonPassingDataOtherView(_ sender: Any) {
Delegate?.StringPasser(ThisText: TexrBeingPassed.text!)
dismiss(animated: true, completion: nil)

}
}

创建更改标签类及其委托的实例,并将自身设置为委托*应该更改标签,但它没有

///class to receive data

class ViewController: UIViewController{
@IBOutlet weak var LableName: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
var lableChange = changeLabel()
lableChange.Delegate = self
// Do any additional setup after loading the view.
}

@IBAction func EditController(_ sender: Any) {
var storyBoard = UIStoryboard(name: "Test", bundle: nil)
var ViewController = storyBoard.instantiateViewController(withIdentifier: "TestView")
self.present(ViewController, animated: true, completion: nil)
}

}

继承协议并告诉它将标签更改为更改标签类委托传递的任何内容

// extension view controller inheriting the protocol
extension ViewController : StingHolder{
func StringPasser(ThisText text: String){
print("Delegate is working")
LableName.text = text
///
}  
}

我希望一个视图控制器编辑另一个视图控制器的文本标签

您作为委托self的对象与屏幕上显示的对象不同。

override func viewDidLoad() {
super.viewDidLoad()
// "labelChange.delegate" is set...
var lableChange = changeLabel()
lableChange.Delegate = self
// Do any additional setup after loading the view.
}

@IBAction func EditController(_ sender: Any) {
var storyBoard = UIStoryboard(name: "Test", bundle: nil)
// but "ViewController" is presented
var ViewController = storyBoard.instantiateViewController(withIdentifier: "TestView")
self.present(ViewController, animated: true, completion: nil)
}

labelChangeViewController是两个不同的、独立的对象。一个通过直接调用init创建,另一个通过调用storyBoard.instantiateViewController创建。您应该改为设置后者的委托:

override func viewDidLoad() {
super.viewDidLoad()
// "labelChange.delegate" can be deleted
}

@IBAction func EditController(_ sender: Any) {
var storyBoard = UIStoryboard(name: "Test", bundle: nil)
if let ViewController = storyBoard.instantiateViewController(withIdentifier: "TestView") as? labelChange {
ViewController.delegate = self
self.present(ViewController, animated: true, completion: nil)
}
}

最新更新