Где установить делегат в swift? - PullRequest
0 голосов
/ 04 апреля 2019

Я создал простой проект Swift, чтобы попытаться обернуть голову делегатами и протоколами.Цель состоит в том, чтобы передавать данные между двумя классами (SendingClass & ReceivingClass).Две кнопки в SendingClass связаны с делегатом, который должен запускать соответствующую функцию протокола в ReceivingClass для выполнения.К сожалению, это не работает, я подозреваю, что это связано с тем, где и как я объявляю ReceivingClass в качестве делегата.

Цените ваши идеи, я только начинаю!

Я пытался установить делегата в разных местах (в настоящее время в viewDidLoad, но не могу заставить его работать).

let vc = SendingClass()
vc.statusDelegate = self

SendingClass.swift

import UIKit


protocol StatusDelegate {
    func statusChanged(state: Bool, sender: String)
}

class SendingClass: UIViewController {

    var statusDelegate : StatusDelegate?


    @IBAction func button1Pressed(_ sender: UIButton) {
      statusDelegate?.statusChanged(state: true, sender: "Button 1")
    }

    @IBAction func button2Pressed(_ sender: UIButton) {
        statusDelegate?.statusChanged(state: false, sender: "Button 2")
    }

}

ReceivingClass.swift

import Foundation
import UIKit

class ReceivingClass: UIViewController, StatusDelegate {

    override func viewDidLoad() {
        let vc = SendingClass()
        vc.statusDelegate = self
    }

    func statusChanged(state: Bool, sender: String) {
        print("Sender = \(sender) , State = \(state)")
    }
}

Ожидается: функция согласования протокола ReceivingClass (func statusChanged) должна выполняться каждый разкнопки нажимаются в SendingClass.

Фактически: Ничего не происходит

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Для протокола и делегата вы используете его, когда хотите перенести значение со 2-го VC (представленного 1-м или выдвинутым 1-м VC) в 1-й VC, который является оригиналом. Из вашего кода я не вижу, чтобы вы представляли или выдвигали свой второй VC. вот почему это не работает. Надеюсь, я ответил на ваши сомнения.

Однако, если вы все еще хотите перенести значение с 1-го ВК на 2-й ВК. Во втором VC создайте переменную для ее получения

var ReceivedData = String()

затем из вашего первого венчурного капитала, когда вы собираетесь его нажать,

let vc = SendingClass()
vc.ReceivedData = "Whatever you want it to receive"
0 голосов
/ 04 апреля 2019

Если вы используете раскадровки, возможно, оттуда создается контроллер представления, поэтому, возможно, вам придется использовать prepareForSegue и получить целевой контроллер представления (который уже создан для вас) в контроллере представления ReceivingClass :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)

    if let destination = segue.destination as? SendingClass {
        destination.delegate = self
    }
}

Также будьте осторожны с паттерном делегата: свойство делегата должно быть объявлено как свойство weak, чтобы избежать цикла сохранения

weak var delegate: MyDelegate?
0 голосов
/ 04 апреля 2019
I am using this..
// create extension in your receiving class
extension ReceivingClass: PopUpVCDelegate {
   func statusChanged(state: Bool, sender: String) {
        print("Sender = \(sender) , State = \(state)")
    }
}

// on sending class, when you present your receiving class on any button click
eg.
let resultController = self.storyboard?.instantiateViewController(withIdentifier: "PopUpVCID") as? PopUpVC       

        resultController?.delegate = self
  self.present(resultController!, animated: true, completion: nil)

 //or if not have button add on viewdidload in receiving class

// here is full eg

Как получить данные из контроллера всплывающего представления в ячейку пользовательского представления таблицы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...