检查数组长度时应用程序崩溃

时间:2014-10-19 21:13:51

标签: ios swift nsmutablearray

我的应用程序的某个特定部分出现问题已经有一段时间了,我认为它已修复,但我刚刚注意到它似乎仍在崩溃。

基本上,我有一个存储预设名称的数组,用户可以用来节省时间。如果用户使用的名称不是预设,则会将其添加到预设列表中。如果他们使用预先存在的预设,则将其移动到列表顶部。预设列表一次限制为15个。

问题在于,当我点击包含所有预设的表格视图的视图控制器的按钮时,应用程序崩溃。

我正在声明这样的数组:

var presetNamesMutable: NSMutableArray = ["Shopping", "Holiday", "Christmas", "Groceries", "Weekend Away", "Birthday", "Wedding", "Day Out", "Savings", "Party"]
var presetNames: NSArray = []

这是预设视图控制器中的代码:

override func viewWillAppear(animated: Bool) {
        presetNames = NSUserDefaults.standardUserDefaults().objectForKey("presets") as NSArray
        presetNamesMutable = presetNames.mutableCopy() as NSMutableArray
        println(presetNamesMutable)

        while presetNamesMutable.count > 15 {
            presetNamesMutable.removeLastObject()
            NSUserDefaults.standardUserDefaults().setObject(presetNamesMutable, forKey: "presets")
        }
} 

这是视图控制器中处理添加/移动名称的代码:

    if presetNamesMutable.containsObject(budgetName) == false && budgetName != "Budget" {
        presetNamesMutable.insertObject(budgetName, atIndex: 0)
        NSUserDefaults.standardUserDefaults().setObject(presetNamesMutable, forKey: "presets")
    } else if presetNamesMutable.containsObject(budgetName) == true && budgetName != "Budget" {
        var indexValue = presetNamesMutable.indexOfObject(budgetName)
        presetNamesMutable.removeObjectAtIndex(indexValue)
        presetNamesMutable.insertObject(budgetName, atIndex: 0)
        NSUserDefaults.standardUserDefaults().setObject(presetNamesMutable, forKey: "presets")
    }

该应用程序崩溃:

        while presetNamesMutable.count > 15 {

有人有什么想法吗?

2 个答案:

答案 0 :(得分:0)

作为临时修复,我将代码更改为:

    if NSUserDefaults.standardUserDefaults().boolForKey("presetsAvailable") == true {
        presetNames = NSUserDefaults.standardUserDefaults().objectForKey("presets") as NSArray
        presetNamesMutable = presetNames.mutableCopy() as NSMutableArray
        println(presetNamesMutable.count)

        while presetNamesMutable.count > 15 {
            presetNamesMutable.removeLastObject()
            NSUserDefaults.standardUserDefaults().setObject(presetNamesMutable, forKey: "presets")
        }
    }

基本上,当用户第一次使用该应用时,它就崩溃了。所以我现在已经做到这一点,以致在用户至少使用过一次应用之前,崩溃应用程序的代码才会被执行。

答案 1 :(得分:0)

我写了一个带有一些println()语句的swift版本来检查准确性。我将数组限制为10个值,因为这是提供的列表,我不想在假期中过于有创意。 :-)将其粘贴在游乐场中:

var presets = ["Shopping", "Holiday", "Christmas", "Groceries", "Weekend Away", "Birthday", "Wedding", "Day Out", "Savings", "Party"]

println(presets)

let name = "Shazam"

func isPreset() {
    if contains(presets, name) {
        println("presets contains \(name)")
    } else {
        presets.insert(name, atIndex: 0)
        println("added \(name) at index 0 of presets")
    }

    while presets.count > 10 {
        println("removed \(presets[presets.count-1]) from presets")
        presets.removeLast()
    }
}

isPreset()
println(presets)