【问题标题】:How do you update the value you delegated from one class to the other?你如何更新你从一个类委托给另一个类的值?
【发布时间】:2020-02-02 04:43:34
【问题描述】:

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

//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)
    }


}

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

// extension view controller inheriting the protocol

extension ViewController : StingHolder{

    func StringPasser(ThisText text: String){

        print("Delegate is working")
        LableName.text = text
        ///
    }  
}

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

【问题讨论】:

  • 故事板中的VC是否是ID为TestViewchangeView类型的VC?
  • 是的,我没有给出相同的名字,对于任何混淆,我深表歉意

标签: swift protocols delegation data-sharing


【解决方案1】:

您拥有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 创建。您应该改为设置 latter 的委托:

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)
    }
}

【讨论】:

  • 那么这个改变所做的就是,将 ViewController 变成 changeLableView 控制器,然后将自己呈现为那个视图控制器?......有没有一种方法可以在不使视图控制器不同的情况下传递数据视图控制器?
  • @rabusmccaleb 我并没有真正将某些内容更改为其他内容。我只是设置正确对象的委托 - 呈现的 VC,而不是在 viewDidLoad 中创建的一些随机对象并且什么也没做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2022-07-08
  • 2015-12-08
  • 1970-01-01
相关资源
最近更新 更多