Swift AppCoordinator通过视图控制器委派

Swift AppCoordinator通过视图控制器委派,swift,swift3,swift4,Swift,Swift3,Swift4,我正在尝试学习协调器模式是如何工作的,尽管我在从一个子协调器的视图控制器到另一个子协调器的视图控制器的代理中遇到了一些问题。 例如,我有一个家庭vc,我想用一个按钮进入详细信息,但我想用下面的代码从HomeTabBarCoordinator管理它 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: An

我正在尝试学习协调器模式是如何工作的,尽管我在从一个子协调器的视图控制器到另一个子协调器的视图控制器的代理中遇到了一些问题。 例如,我有一个家庭vc,我想用一个按钮进入详细信息,但我想用下面的代码从HomeTabBarCoordinator管理它

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    window = UIWindow()
    let tabBarController = UITabBarController()
    window?.rootViewController = tabBarController
    let about = HomeTabBarCoordinator()
    let one = deGenericize(about)
    let appCoordinator = TabAppCoordinator(tabBarController: tabBarController, tabs: [one])
    appCoordinator.start()

    window?.makeKeyAndVisible()
    return true
}

public protocol TabCoordinator {
    associatedtype RootType: UIViewController
    var rootController: RootType { get }
    var tabBarItem: UITabBarItem { get }
}

public class AnyTabCoordinator {
    var rootController: UIViewController
    var tabBarItem: UITabBarItem

    public init<T: TabCoordinator>(_ tabCoordinator: T) {
        rootController = tabCoordinator.rootController
        tabBarItem = tabCoordinator.tabBarItem
    }
}

public func deGenericize<T: TabCoordinator>(_ coordinator: T) -> AnyTabCoordinator {
    return AnyTabCoordinator(coordinator)
}

public class TabAppCoordinator {

    var tabBarController: UITabBarController
    var tabs: [AnyTabCoordinator]

    public init(tabBarController: UITabBarController, tabs: [AnyTabCoordinator]) {
        self.tabBarController = tabBarController
        self.tabs = tabs
    }

    public func start() {
        tabBarController.viewControllers = tabs.map { (coordinator) -> UIViewController in
            return coordinator.rootController
        }
    }

}
protocol HomeTabBarDelegate: class {
    func goToProfile()
}

class HomeTabBarCoordinator: NSObject, TabCoordinator {
    var rootController: UINavigationController
    var tabBarItem: UITabBarItem = UITabBarItem(title: "About", image: UIImage(named: "AboutTabBarIcon"), selectedImage: UIImage(named: "AboutTabBarIcon_Filled"))
    let homeVC: HomeViewController

    override init() {
        self.homeVC = HomeViewController()
        self.rootController = UINavigationController()
        super.init()
        rootController.viewControllers = [homeVC]
        rootController.tabBarItem = tabBarItem
        homeVC.delegate = self //is being set properly when i add a breakpoint here
    }


}

extension HomeTabBarCoordinator: HomeTabBarDelegate {
    func goToProfile() { //never being executed
        let details = DetailsViewController()
        rootController.pushViewController(details, animated: true)
    }
}



class HomeViewController: UIViewController {
    weak var delegate: HomeTabBarDelegate?

    let button = UIButton()
    init() {
        super.init(nibName: nil, bundle: nil)
    }

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

    func setupView() {
        view.addSubview(button)
        button.snp.makeConstraints { (make) in
            make.center.equalToSuperview()
        }
        view.backgroundColor = .white
        button.setTitle("test", for: .normal)
        button.setTitleColor(.red, for: .normal)
        button.addTarget(self, action: #selector(didPress), for: .touchDown)
    }

    @objc func didPress() {
        delegate?.goToProfile() //delegate is nil
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        setupView()
        // Do any additional setup after loading the view.
    }
}
违规代码:

let about = HomeTabBarCoordinator()
它有什么作用?它创建一个局部变量并在其中存储一个
HomeTabBarCoordinator()
对象。
一旦应用程序(\uFinishLaunchingWithOptions)运行,它会做什么?它当然会拒绝,因为没有创建新的强引用(声明委托是件好事!)

你可能认为

public init<T: TabCoordinator>(_ tabCoordinator: T) {
    rootController = tabCoordinator.rootController
    tabBarItem = tabCoordinator.tabBarItem
}
不,他们没有。再见
hometabarCoordinator
!因此,
delegate
变为零

如何保持一个强ref.to let about=HomeTabBarCoordinator()

把它放在一个自身被强引用的类中就足够了。任何未声明为弱/无主的引用都是强引用,并且将在包围类幸存的情况下继续存在


而且
AppDelegate
尽可能地确保它不会自行删除。

哦,好吧,我不理解,但即使我在函数外部声明
HomeTabBarCoordinator
,我仍然有同样的问题。我将用更新的代码编辑问题。
print(“Delegate:\(Delegate!=nil)”)
在修复后打印
Delegate:true
。如果您认为修正使代表保持非零,请接受答案。
public init<T: TabCoordinator>(_ tabCoordinator: T) {
    rootController = tabCoordinator.rootController
    tabBarItem = tabCoordinator.tabBarItem
}
class HomeTabBarCoordinator: NSObject, TabCoordinator {
    var rootController: UINavigationController
    var tabBarItem: UITabBarItem = UITabBarItem(title: "About", image: UIImage(named: "AboutTabBarIcon"), selectedImage: UIImage(named: "AboutTabBarIcon_Filled"))
    let homeVC: HomeViewController

    override init() {
        self.homeVC = HomeViewController()
        self.rootController = UINavigationController()
        super.init()
        rootController.viewControllers = [homeVC]
        rootController.tabBarItem = tabBarItem
        homeVC.delegate = self //is being set properly when i add a breakpoint here
    }
}