我在委派方面遇到问题。我对这个概念还比较陌生,但从概念上讲我明白了,而且它很重要。我只是在使用它时遇到问题。我似乎无法将数据从一个类传递到另一个类。我知道现有的关于堆栈溢出的委托(delegate)示例,但它们并没有完全理解我的误解。我使用了协议(protocol)、委托(delegate),并在类里面调用它。我相信我只是遗漏了一些细微差别......而且我的代码中缺乏功能是显而易见的
//my protocol:
protocol StingHolder {
func StringPasser(ThisText text: String)
}
创建委托(delegate)协议(protocol)关系,放置要传递的数据然后关闭 View Controller
// 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)
}
}
创建更改标签类及其委托(delegate)的实例并将其自身设置为委托(delegate) *应该更改标签,但它没有
///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)
}
}
继承协议(protocol)并告诉它将标签更改为 changelabel 类委托(delegate)通过的任何内容
// extension view controller inheriting the protocol
extension ViewController : StingHolder{
func StringPasser(ThisText text: String){
print("Delegate is working")
LableName.text = text
///
}
}
我想让一个 View Controller 编辑另一个 View Controller 的文本标签
最佳答案
您将 self
作为委托(delegate)的对象与屏幕上显示的对象不同。
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)
}
labelChange
和 ViewController
是两个不同的独立对象。一个是直接调用init
创建的,一个是调用storyBoard.instantiateViewController
创建的。您应该改为设置后者的委托(delegate):
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)
}
}
关于swift - 你如何更新你从一个类委托(delegate)给另一个类的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58226315/