Swift 中不调用协议委托方法

Posted

技术标签:

【中文标题】Swift 中不调用协议委托方法【英文标题】:Protocol Delegate Method is not called in Swift 【发布时间】:2017-07-20 11:56:50 【问题描述】:

没有调用协议委托方法..

首次查看控制器代码

class ViewController: UIViewController,customDelegate 

  var seconviewcontroller : SecondViewController = SecondViewController()
  @IBOutlet weak var Label: UILabel!
    override func viewDidLoad() 
        super.viewDidLoad()

    seconviewcontroller.delegate = self

func didSelectData(_ result: String) 

    Label.text = result
  print("Didselect Data Call")


第二个视图控制器代码

import UIKit
protocol customDelegate: class 
    func didSelectData(_ result: String)


class SecondViewController: UIViewController 
     var delegate: customDelegate?

@IBOutlet weak var secondbutton: UIButton!

override func viewDidLoad() 
    super.viewDidLoad()


@IBAction func secondbuttonclick(_ sender: Any) 
     let selectedItem = "naga"

     delegate?.didSelectData(selectedItem)

如何调用函数 didSelectData 请帮助我

【问题讨论】:

【参考方案1】:

正如您已经使用 segue 在视图之间导航一样。您也可以在此示例中使用它。我将以下内容作为代码示例提供,以便您可以追溯自己以检测代码中的问题。

第一个视图控制器

import UIKit

class ViewController: UIViewController, SecondVCDelegate 
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if let secondVC = segue.destination as? SecondViewController 
            secondVC.delegate = self
        
            

    func didSelectData(_ result: String) 
        label.text = result
        print(result)
    

第二个视图控制器

import UIKit

protocol SecondVCDelegate: class 
    func didSelectData(_ result: String)


class SecondViewController: UIViewController 
    @IBOutlet weak var button: UIButton!

    weak var delegate: SecondVCDelegate?

    override func viewDidLoad() 
        super.viewDidLoad()
    

    @IBAction func buttonTapped(_ sender: UIButton) 
        delegate?.didSelectData("My result")
        dismiss(animated: true, completion: nil)
    

【讨论】:

不用担心,很高兴它有帮助。 我必须将第一个视图控制器的数据传递给第二个视图控制器我知道 segue 在那里但我必须使用协议委托请帮助如何做 我在第一个视图控制器中计算了学生数我必须将该数据计数传递给第二个视图控制器如何在没有 segue/用户默认值的情况下传递它我想在第二个视图控制器上打印该计数跨度> 如果我可以将实例作为全局,我将访问另一个控制器中学生的计数 有多种方法可以将数据从一个视图控制器传递到另一个视图控制器。如果你不再继续,而是使用导航,从第一个 VC 开始,你可以简单地做 seconVC.dataList = self.dataListnavigationController?.pushViewController(secondVC, animated: true)【参考方案2】:

所以基本上var seconviewcontroller : SecondViewController = SecondViewController() 与您的推送视图控制器实例不同。

您正在创建一个单独的 SecondViewController 实例,因此您在使用 pushes 这样的对象推送时已经完成了委托自己

let secondVCInstance = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
secondVCInstance.delegate = self
self.navigationController?.pushViewController(secondVCInstance, animated: true)

注意:- 每个对象都有自己的属性

【讨论】:

【参考方案3】:

第一个视图控制器

import UIKit

class ViewController: UIViewController, SecondVCDelegate 
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if let secondVC = segue.destination as? SecondViewController 
            secondVC.delegate = self
        
            

    func didSelectData(_ result: String) 
        label.text = result
        print(result)
    

第二个视图控制器

import UIKit

protocol SecondVCDelegate: class 
    func didSelectData(_ result: String)


class SecondViewController: UIViewController 
    @IBOutlet weak var button: UIButton!

    weak var delegate: SecondVCDelegate?

    override func viewDidLoad() 
        super.viewDidLoad()
    

    @IBAction func buttonTapped(_ sender: UIButton) 
        delegate?.didSelectData("My result")
        dismiss(animated: true, completion: nil)
    

【讨论】:

以上是关于Swift 中不调用协议委托方法的主要内容,如果未能解决你的问题,请参考以下文章

委托和数据源在 MessageKit Swift IOS 中不起作用

在 Swift 上委托 Objective-C 协议

Swift使用委托实现多个协议

Swift学习第八枪--协议

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

Swift:我的委托协议方法需要在另一个视图控制器上执行