【问题标题】:How to track changes in currently visible ViewController as user navigating the screens in iOS?当用户在 iOS 中导航屏幕时,如何跟踪当前可见 ViewController 的变化?
【发布时间】:2022-08-06 13:37:22
【问题描述】:

我正在尝试复制 Firebase Analytics 行为,它会在 ViewController 屏幕发生变化时自动触发屏幕事件。 虽然我可以使用以下方法找到当前可见的 ViewController:

UIApplication.shared.windows.first?.rootViewController?.presentedViewController

但是我需要一些方法来获得有关 rootViewController 任何更改的通知。我试图观察这个根视图控制器使用 KVO,但我没有收到任何回调。我发现 KVO 仅适用于具有动态属性的 NSObject。 有什么方法可以接收 ViewController 更改的回调?由于这将是一个库项目,因此我无法更改主代码以支持该功能。

  • 我也有同样的问题。你有没有找到解决办法?
  • 是的,使用 Method Swizzling,我们可以创建自己的 viewDidAppear/load 实现。

标签: ios swift uiviewcontroller firebase-analytics


【解决方案1】:

以下解决方案对我有用:-

import Foundation
import UIKit

public extension UIViewController {

@objc dynamic func _tracked_viewWillAppear(_ animated: Bool) {
    UserActivityTracker.startTracking(viewController: self)
}

static func swizzle() {
        //Make sure This isn't a subclass of UIViewController,
        //So that It applies to all UIViewController childs
        if self != UIViewController.self {
            return
        }
        let _: () = {
            let originalSelector =
                #selector(UIViewController.viewWillAppear(_:))
            let swizzledSelector =
                #selector(UIViewController._tracked_viewWillAppear(_:))
            let originalMethod =
                class_getInstanceMethod(self, originalSelector)
            let swizzledMethod =
                class_getInstanceMethod(self, swizzledSelector)
            method_exchangeImplementations(originalMethod!, swizzledMethod!);
        }()
    }
 } 

在上面的代码中,_tracked_viewWillAppear() 是我的自定义函数,我想在调用实际实现之前调用我的实现。 然后在 AppDeligate 类中,调用 UIViewController.swizzle() 方法,如下:-

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    UIViewController.swizzle()
    return true
}

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2016-07-26
    • 2019-06-03
    • 1970-01-01
    • 2019-12-21
    • 2020-09-29
    相关资源
    最近更新 更多