Как вы обновляете значение, которое вы делегировали от одного класса к другому? - PullRequest
1 голос
/ 03 октября 2019

У меня проблема с делегированием. Я относительно новичок в концепции, но концептуально я понимаю, и это важно. У меня просто проблемы с его использованием. Я не могу передать данные из одного класса в другой. Я знаю, что существуют примеры делегирования переполнения стека, но они не совсем улавливают мое недоразумение. Я получаю использование протоколов, делегирование и вызов его в классе. Я полагаю, что есть лишь небольшой нюанс, который мне не хватает ... И это видно по отсутствию функциональности в моем коде

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

Я хочу, чтобы один контроллер представления редактировал текстовую метку другого контроллера представления

1 Ответ

1 голос
/ 03 октября 2019

Объект, делегатом которого является 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)
}

labelChange и ViewController - это два разных независимых объекта. Один создан путем вызова 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...