检查用户是否已打开每个viewcontroller

时间:2016-11-11 19:11:00

标签: ios swift

我想知道,是否可以检查用户是否已打开该应用程序的每个viewcontroller

我想这样做,因为我给用户徽章,这是我想要的。

我假设我必须将某些内容存储到userDefaults中并以某种方式收集信息,然后做我想做的事,我是对的吗?如果我是对的,那么每次用户打开新的viewcontroller时,我应该做一些全局变量并添加计数吗?

感谢任何信息。

4 个答案:

答案 0 :(得分:2)

设置一个选项以表示每个viewController。在每个viewControllers ViewDidAppear中,读取并更新Userdefaults中存储显示的viewControllers选项集的字段,然后将其写回Userdefaults。

    struct UserDefaultsKey {
        static let displayedViewControllers = "displayedViewControllers"
    }

    struct DisplayedViewControllers: OptionSet {
        let rawValue: Int

        static let vc1 = DisplayedViewControllers(rawValue: 1 << 0)
        static let vc2 = DisplayedViewControllers(rawValue: 1 << 1)
        static let vc3 = DisplayedViewControllers(rawValue: 1 << 2)
        static let vc4 = DisplayedViewControllers(rawValue: 1 << 3)
        static let all = [vc1, vc2, vc3, vc4]
    }

    class vc1: UIViewController {
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(true)
            var displayedViewControllers = DisplayedViewControllers(rawValue: UserDefaults.standard.integer(forKey: UserDefaultsKey.displayedViewControllers))
            displayedViewControllers.insert(.vc1)
            UserDefaults.standard.set(displayedViewControllers.rawValue, forKey: UserDefaultsKey.displayedViewControllers)
        }
    }

    func haveAllViewControllersBeenDisplayed() -> Bool {
        let displayedViewControllers = DisplayedViewControllers(rawValue: UserDefaults.standard.integer(forKey: UserDefaultsKey.displayedViewControllers))
        for controller in DisplayedViewControllers.all {
            if displayedViewControllers.contains(controller) == false {
                return false
            }
        }
        return true
    }

答案 1 :(得分:1)

你可以这样做,如果你正在使用UINavigationController,那么在每个UINavigationController Stack的末尾设置UserDefaul中的一个真正的密钥,就像这样

UserDefaults.standard.set(true, forKey: "NavigationStack1")

现在让我们假设您的应用程序有4种不同类型的导航,然后您可以设置这样的,使用不同的密钥

UserDefaults.standard.set(true, forKey: "NavigationStack1")
UserDefaults.standard.set(true, forKey: "NavigationStack2")
UserDefaults.standard.set(true, forKey: "NavigationStack3")
UserDefaults.standard.set(true, forKey: "NavigationStack4")

然后在每个UINavigationController的Stack的末尾,你需要检查用户是否已经访问过所有这样的导航

if  UserDefaults.standard.bool(forKey: "NavigationStack1")&&UserDefaults.standard.bool(forKey: "NavigationStack2")&&UserDefaults.standard.bool(forKey: "NavigationStack3")&&UserDefaults.standard.bool(forKey: "NavigationStack4"){
    // Give Badge to user
}

你也可以为每个UIViewController做到,在每个控制器的viewDidLoad中将该viewController的键设置为true然后,检查所有键的结果,这样你就可以知道用户是否已访问过所有键您应用的UIViewController。

答案 2 :(得分:1)

假设您有三个ViewControllers:ViewController1,ViewController2,ViewController3

方法1:NSUserDefaults中的ViewController名称数组:

维护一组打开的ViewController名称:( Set可以序列化/反序列化为NSUserDefaults)

var openedViewControllers = Set<String>()

打开viewController1后,将其插入到设置中。

openedViewControllers.insert(viewController1Name)

如何检查是否所有viewController都已打开:

if openedViewController.count == 3{
   //All three viewControllers were opened
}

方法2:使用位掩码:(将保存为正常的UInt64)

您使用UInt64 = 0并且每个视图控制器将映射到一些Int64。 打开该视图控制器后,您将相应的位从0更改为1.

实施例:  ViewController1(已打开),ViewController2(从未打开),ViewController3(已打开)=&gt; BitMask将是1010000 ......

如何检查是否所有viewController都已打开:

if BitMask == 3{
   //All three viewControllers were opened
}

N.B。使用第二种方法,您的应用程序中只能有64个ViewControllers

答案 3 :(得分:0)

您可以使用View Controller名称列表在CoreData中保存Bool数组。每次打开ViewController时都要检查它。

您也可以使用UserDefaults.standard.setValue并存储您的词典或数组。

希望它有所帮助!