没有 performSegue 的委托不会被调用 Swift 5

Posted

技术标签:

【中文标题】没有 performSegue 的委托不会被调用 Swift 5【英文标题】:Delegate without performSegue not getting called Swift 5 【发布时间】:2020-02-04 12:49:57 【问题描述】:

我的协议(其中“VehicleRegVCs”是枚举):

protocol VehicleRegVCDelegate: class 
        func presentedVC(_ currentVC: VehicleRegVCs)
    

我的买家类:

class BuyerOwnerInfoViewController: UIViewController 

    weak var delegate: VehicleRegVCDelegate?

    override func viewDidLoad() 
        super.viewDidLoad()

        delegate?.presentedVC(.buyerOwnerInfo)
    

我的主类(未调用底部的委托函数“func presentVC”):

class VehicleRegContainerViewController: ICTViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        setupView()
    

    func setupView() 
        let buyerVC = getBuyerOwnerInfoVC()
        buyerVC.delegate = self
    


extension VehicleRegContainerViewController: VehicleRegVCDelegate 
    func presentedVC(_ currentVC: VehicleRegVCs) 

    


我希望“presentedVC”被调用...我也做了一个委托...

在 UIViewController 扩展中我已经实现了这个功能......

    func getBuyerOwnerInfoVC() -> BuyerOwnerInfoViewController 
        let vc = UIStoryboard.exciseAndTaxation.instantiateViewController(withIdentifier: "BuyerOwnerInfoViewController") as! BuyerOwnerInfoViewController
        return vc
    

【问题讨论】:

您能否展示一下getBuyerOwnerInfoVC 是如何实现的以及您如何以及在何处展示BuyerOwnerInfoViewController func getBuyerOwnerInfoVC() -> BuyerOwnerInfoViewController let vc = UIStoryboard.exciseAndTaxation.instantiateViewController(withIdentifier: "BuyerOwnerInfoViewController") as! BuyerOwnerInfoViewController return vc BuyerOwnerInfoViewController 已成功呈现,因为正在调用 viewDidLoad... 您应该edit 您的问题包含该信息。 实际上BuyerOwnerInfoViewController 是在容器视图中... @JawadAli 您正在创建一个新的 VC 实例并为其分配委托。那是行不通的。您应该使用 prepareForSegue 将其分配给您的嵌入式控制器 【参考方案1】:

containerView 中的 ViewController 使用 segue 连接。您可以使用 prepareForSegue 方法获取控制器并将委托分配给它。

注意:转到故事板并单击连接容器视图和视图控制器的 segue,并为其分配一个标识符。在下面的示例中,我使用了“yourSegueIdentifier”,将其替换为您的标识符。

class VehicleRegContainerViewController: ICTViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
    


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
         if let buyerVC = segue.destination as? BuyerOwnerInfoViewController 
             buyerVC.delegate = self
          else 
             print("Error in segue")
         
     

【讨论】:

我做了同样的事情,但是 (segue.identifier == "yourSegueIdentifier") 是假的...虽然我给了相同的 segue 名称... (buyerVC = segue.destination as?BuyerOwnerInfoViewController) = true它打印“segue 中的错误” 我明白了......你是对的,在“BuyerOwnerInfoViewController”之前有导航控制器......我的下一个问题是......我怎样才能获得“BuyerOwnerInfoViewController”旁边的VC参考“......并且在“BuyerOwnerInfoViewController”旁边有一系列 5 VC......在其他地方,我通过通知实现了这个......但现在我正在尝试通过代表实现当前呈现的 VC...... @JawadAli 作为一个单独的问题提出并在那里详细解释。如果有帮助,请接受这个。

以上是关于没有 performSegue 的委托不会被调用 Swift 5的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 委托 shouldChangeTextInRange (或任何以上)不会被调用

CALayer委托方法drawLayer没有被调用

performSegue 并不总是转换,但 prepare(for:sender) 总是被调用

UIAlertController 的文本字段委托没有被调用

animationDidStop:完成:委托方法没有被调用

XCTest CLLocationManager 的委托方法不会被调用