弱委托和.xib文件

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

为什么在使用.xib文件时没有弱弱的委托人?

我做了一个不使用情节提要的简单项目。它仅使用与UIViewControllers关联的.xib文件。它为用户提供了一个按钮,按下该按钮后,将按下一个新的视图控制器并允许他们返回。如果下面的navDelegate被列为弱,则由于navDelegate始终为nil,所以将不会导航到DetailViewController。

SceneDelegate.swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let winScene = scene as? UIWindowScene else {
            return
        }
        window = UIWindow(windowScene: winScene)
        AppCoordinator().start()
    }
}

AppCoordinator.swift

import UIKit

protocol Coordinator: AnyObject {
    func start()
}

class AppCoordinator: Coordinator {
    let router = UINavigationController()

    func start() {
        let vc = RootViewController()

        vc.navDelegate = self
        router.viewControllers = [vc]
        let window = UIApplication.shared.windows.first
        window?.rootViewController = router
        window?.makeKeyAndVisible()
    }
}

extension AppCoordinator: NavDelegate {
    func buttonTapped() {
        let vc = DetailViewController()
        router.pushViewController(vc, animated: true)
    }
}

RootViewController.swift

import UIKit

protocol NavDelegate: AnyObject {
    func buttonTapped()
}

class RootViewController: UIViewController {

    // Does this navDelegate need to be weak when using .xib files?
    var navDelegate: NavDelegate?

    init() {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func tapDetailButton(_ sender: Any) {
        // Always prints 2 no matter how many times I navigate back and forth
        let refCount = CFGetRetainCount(navDelegate)
        print("Ref Count: \(refCount)")
        navDelegate?.buttonTapped()
    }
}

DetailViewController.swift

import UIKit

class DetailViewController: UIViewController {

    init() {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

}
ios swift delegates xib
1个回答
0
投票

与xibs无关。

[如果您知道weak的意思,那么您就知道它的意思是“如果没有其他人对这件事有强烈的指涉,那就让它消失。”

因此,当您说vc.navDelegate = self,即AppCoordinator实例中的self时,如果没有其他对该AppCoordinator实例的引用保留了它,则此后它立即消失在烟雾中。

嗯,这个实例的人生故事是什么?

 AppCoordinator().start()

那条线是做什么的?它创建一个AppCoordinator实例,在其上调用start,然后将该AppCoordinator放在地板上,如果没有其他人按住它,则该实例将不复存在。而且没有其他人坚持使用它,因为其他人对此的唯一参考是weak

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