我的应用程序的某个特定部分出现问题已经有一段时间了,我认为它已修复,但我刚刚注意到它似乎仍在崩溃。
基本上,我有一个存储预设名称的数组,用户可以用来节省时间。如果用户使用的名称不是预设,则会将其添加到预设列表中。如果他们使用预先存在的预设,则将其移动到列表顶部。预设列表一次限制为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 {
有人有什么想法吗?
答案 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)