当我在模拟器上运行此代码时,它运行得很好,但它在真实设备上崩溃了吗?
var num = 0 //or 1
notificationTime = ["2016-05-30 19:59:42 +0000","2016-05-15 16:54:22 +0000"]
if notificationTime[num] != ""
{
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale.currentLocale()
dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
var newString = NSString(string: "\(notificationTime[num])")
var str1 = newString.substringToIndex(10)
var str2 = newString.substringFromIndex(11)
var finalStr = str1 + "T" + str2
var dateAsString = finalStr
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let newDate = dateFormatter.dateFromString(dateAsString)!
}
它在最后一段代码中说,当我在真实设备上运行它时它是零,在模拟器上运行完美!
var arrLocalNotif = UIApplication.sharedApplication().scheduledLocalNotifications
for localN:UILocalNotification in arrLocalNotif!
{
var notificationFireDate:NSDate = localN.fireDate!
if notificationFireDate == newDate
{
UIApplication.sharedApplication().cancelLocalNotification(localN)
}
}
答案 0 :(得分:0)
似乎其中一个UILocalNotification
个实例没有fireDate
,但你强行打开它。你可能想要这样的东西,而不是你现在得到的东西:
for localN:UILocalNotification in arrLocalNotif! {
if let notificationFireDate = localN.fireDate where notificationFireDate == newDate {
UIApplication.sharedApplication().cancelLocalNotification(localN)
}
}
答案 1 :(得分:0)
看起来在设备和模拟器上对日期的解析方式有所不同。您使用NSLocale.currentLocale()
初始化日期格式化程序。如果您在设备和模拟器上使用不同的区域设置,则可能会出现问题。
您可以在设备上致电newDate
后检查nil
是否不是dateFromString
。
如果日期格式化程序出现问题,请尝试在格式化日期字符串时进行设置,或使用NSCalendar
API将所需日期合成为NSDate
个对象,而不是从字符串。
答案 2 :(得分:0)
如果您将日期作为字符串传递以用作数据(即,不将其显示给用户),并且您希望在每一端都进行可靠的转换,则使用ISO日期格式并将日期格式化程序的区域设置设置为en_US_POSIX
正如Apple在“解析日期字符串”here中所描述的那样。
否则, 会在某些时候失败,因为其他区域设置会受到用户设置的影响,并且设备之间会有所不同。当然不要使用NSDateFormatter
上的“样式”选项。它们用于从日期创建面向用户的字符串,绝不应该用于将字符串转换为日期。