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