2017-03-04 48 views
0

我试图根据UserDefaults启用UISegmentedController索引。但我的问题,我不知道如何启用索引,如果函数返回true。根据用户默认值启用分段控制器索引

我有一个主视图控制器,它有segmentedController

可以说我有4个索引。 0被使能并且1,2,3,4被禁止。现在如果得分是>= value,我想启用索引1.

我知道我可以启用和禁用segmentAt像这样:segmentedControl.setEnabled(true, forSegmentAt: 1) // can also be false但我该如何将它实现到函数中。

这就是我想要做的事:

class func checkIfEligibleForNextDifficulty(key: String, score: Int) -> Bool{ 
     let userDefaults = UserDefaults.standard 

     if userDefaults.integer(forKey: key) >= score{ 
      return true 
     } 

     return false 
    } 

,我使用它是这样的:

if Util.checkIfEligibleForNextDifficulty(key: "diff2", score: 8){ 
    //Here I want to enable the index 1 
} 

什么是这种变薄的最佳方法?我应该声明一些全局变量吗?

回答

1

你可以建模一个概念,如Level和一个级别可以从score创建。因此,当您用分数初始化Level时,会自动推断出该级别。

然后,考虑到级别将是一个int枚举将帮助您匹配它与您的分段控制的索引。

要根据得分启用关卡,您可以创建一个如下所示的功能。

enum Level: Int { 
    case beginner 
    case medium 
    case advanced 
    case expert 
} 

//MARK: Score & Enabling levels 

extension Level { 

    init(score: Int) { 
     switch score { 
     case 1..<8: self = .beginner 
     case 8..<20: self = .medium 
     case 20..<100: self = .advanced 
     case 100..<Int.max: self = .expert 
     default: self = .beginner 
     } 
    } 

    func enabledLevels() -> [Level] { 
     switch self { 
     case .beginner: return [.beginner] 
     case .medium: return [.beginner, .medium] 
     case .advanced: return [.beginner, .medium, .advanced] 
     case .expert: return [.beginner, .medium, .advanced, .expert] 
     } 
    } 
} 

作为练习,尽量去适应我的解决方案,用于将UserDefaults,该不会是困难的。

希望它有助于解决您的问题。 :)

+0

你能解释一下,你将如何使用这种方法启用或禁用分段控制器索引?如果我想使用userdefaults,我想我只需要在initing中添加它?顺便说一句,我不能使用这个,因为我有每个级别的viewcontroller。并且每个级别都有它自己的userDefault值,分数为:。 –

+0

级别可以与用户默认值有关,因此一旦您想从分数初始化级别,您将根据您的需求查询用户默认值。想象一下,你有这个'级别(得分:45)'那么你可以启用这样的水平: '让ALEVEL =级别(得分:45)。 aLevel.enabledLevels(){的forEach在 \t segmentedControl.setEnabled水平( true,forSegmentAt:level.rawValue) }' – Ricowere