委托给另一个视图控制器不起作用

Delegation to another view controller is not working

我的委托发件人 class:

import UIKit

protocol tapDelgation:class {
    func tapConfirmed(message:String)
}

class ViewController: UIViewController {
    weak var delegate:tapDelgation?

    @IBAction func deligateSenderAction(_ sender: Any) {
        var data = "hello world"
        print(data)
        self.delegate?.tapConfirmed(message: data)
    }
}

我的收件人class:

import UIKit

class NextViewController: UIViewController {
    weak var vc:ViewController? =  ViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        vc?.delegate = self
    }
}

extension  NextViewController : tapDelgation {
    func tapConfirmed(message: String) {
        print(message)
    }
}

预期结果:发送方 vc 上的按钮被按下,接收方 vc 将弹出控制台打印。但徒劳无功,什么也没有发生。有谁知道为什么会这样?如果不可能,那为什么?

我觉得这像是内存管理问题。

第一个问题:使用像 ViewController() 这样的默认初始化程序创建视图控制器几乎从来都不是正确的做法。因为它不会有任何视图内容。

您没有解释您的 NextViewControllerViewController 是如何创建和显示的。

看起来NextViewControllerViewController的引用很弱,ViewController的委托点也很弱(委托引用几乎总是很弱。)

这一行:

weak var vc:ViewController? =  ViewController()

将导致 NextViewController 创建一个不属于任何人的 ViewController 实例,因此它将立即被释放并且 vc 变量将变回 nil .当您到达 NextViewController 的 viewDidLoad 时,vc 将为零,因此 vc?.delegate = self 行中的可选绑定不会执行任何操作。

NextViewControllervc 变量几乎可以肯定是一个强引用,而不是弱引用,但你没有说明 ViewController 是如何显示到屏幕上的,所以它不清楚您要做什么。

weak var vc:ViewController? =  ViewController()

如果您没有在其他地方设置 vc 并且任何其他实例都没有对它保持强引用,请删除弱。

如果还有强引用的实例,请分享相关代码

https://whosebug.com/users/205185/duncan-c 的答案是完全正确的,除非有任何其他代码影响 NextViewController 的呈现和对 vc: ViewController

的引用

I changed viewController to SenderViewController but no luck and Sender and receiver is connected via navigation controller. i.e. If i press a button on sender a recieve comes via push transition. my aim was to since it is triggered an IBAction then the second view controller would implements the tap confirmed function. thanks for your answer. Learned a lot :)

由于此评论,您需要在 ViewController(原始方法)中实现 prepareForSegue() 方法,并设置 [=30= 的 vc 属性 ] 在那里查看控制器而不是 "next" 中的 = ViewController() 在 ViewController 上进行扩展:

extension ViewController {
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let nextController = segue.destinationViewController as! NextViewController
        nextController.vc = self
    }
}

基于评论的解释:

您将获得 NextViewController 的新实例,并在其初始化时实例化 ViewController 的新实例(而不是将 ViewController 的原始实例传递给它)。这就是您可以通过委派获得奇怪行为的地方。

弱变量vc:ViewController? = ViewController() Remove weak for vc 它会在消失后释放视图控制器内存