swift - 你如何更新你从一个类委托(delegate)给另一个类的值?

标签 swift protocols delegation data-sharing

我在委派方面遇到问题。我对这个概念还比较陌生,但从概念上讲我明白了,而且它很重要。我只是在使用它时遇到问题。我似乎无法将数据从一个类传递到另一个类。我知道现有的关于堆栈溢出的委托(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)
}

labelChangeViewController 是两个不同的独立对象。一个是直接调用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/

相关文章:

ios - Swift 中的嵌套字典

java - 如何让 Hadoop 服务器监听所有 IP

javascript - 如何向 div 的所有子节点和这些 div 的数组添加事件监听器?

ios - 单元格中的破坏约束

swift - 检查 SKAction 是否包含一个 Action (快速)

python - python 协议(protocol)中的泛型 - 协方差和逆变

ios - 在 segue 中绘制 vs 编写代码来转换 View ——为什么数据有时不传输?

xcode - 为什么我的 NSURLConnection 委托(delegate)方法没有被调用?

ios - 在特定范围内向 NSMutableAttributedString 添加属性

javascript - 什么是hm ://protocol?