与《公约》未连接的代表和协议

问题描述 投票:0回答:2

我有一个父视图控制器,即HomeViewController,它有一个导航栏按钮,用户可以通过它触发警报并输入一个字符串。这个字符串需要传递给子视图控制器。

下面是父视图控制器中的相关代码。

protocol NewSectionDelegate {
    func sendSectionName(name : String)
}

class HomeViewController: UIViewController {
var sectionNameDelegate : NewSectionDelegate?

func addCardAsChild() { // add the child VC to the parent VC
if cardViewController == nil {
                cardViewController = CardViewController()
                addViewController(newViewController: cardViewController!)
            } else {
                addViewController(newViewController: cardViewController!)
            }
}

func triggerAlert() {
let alertController = UIAlertController(title: "New section", message: "Name the section with a words or a sentence", preferredStyle: .alert)
                alertController.addTextField(configurationHandler:
                    {(_ textField: UITextField) -> Void in //txtview customization
                    })

                let addAction = UIAlertAction(title: "Add", style: .default) { _ in
                    guard let sectionName = alertController.textFields?.first?.text else { return }
                    self.sectionNameDelegate?.sendSectionName(name: sectionName) // Sending string; verified that the string is not nil
                }

                alertController.addAction(addAction)
                self.present(alertController, animated: true, completion: nil)
}

这里是子视图控制器

class CardViewController: UIViewController,  NewSectionDelegate {

override func viewDidLoad() {
        super.viewDidLoad()
        let homeViewController = HomeViewController()
        homeViewController.sectionNameDelegate = self
     }

    func sendSectionName(name: String) {
print("received name:\(name)") // This line of code is never called
}

数据没有被传递,我不知道为什么。

swift delegates protocols
2个回答
2
投票

这是你要找的吗?

protocol NewSectionDelegate {
    func sendSectionName(name : String)
}

class HomeViewController: UIViewController {
    var sectionNameDelegate : NewSectionDelegate?
    var cardViewController = CardViewController()

    func addCardAsChild() { // add the child VC to the parent VC
        self.addChild(self.cardViewController)
    }

    func triggerAlert() {
        let alertController = UIAlertController(title: "New section", message: "Name the section with a words or a sentence", preferredStyle: .alert)
        alertController.addTextField(configurationHandler:
            {(_ textField: UITextField) -> Void in //txtview customization
        })

        let addAction = UIAlertAction(title: "Add", style: .default) { _ in
            guard let sectionName = alertController.textFields?.first?.text else { return }
            self.sectionNameDelegate?.sendSectionName(name: sectionName) // Sending string; verified that the string is not nil
        }

        alertController.addAction(addAction)
        self.present(alertController, animated: true, completion: nil)
    }
}

class CardViewController: UIViewController,  NewSectionDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let homeViewController = self.parent as? HomeViewController else { return }
        homeViewController.sectionNameDelegate = self
    }

    func sendSectionName(name: String) {
        print("received name:\(name)") // This line of code is never called
    }
}

0
投票

我认为委托方法正在被调用,但对于内部的 HomeViewController 你正在做的 ChildViewController viewDidLoad 方法。 看起来你希望该方法在不同的对象上被调用。 我会把这段代码从 viewDidLoad 并设定 sectionNameDelegateHomeViewController

© www.soinside.com 2019 - 2024. All rights reserved.