当我在模拟器上运行此代码时,它运行得很好,但它在真实设备上崩溃了吗?

时间:2016-05-30 18:08:18

标签: ios swift nsdateformatter uilocalnotification

当我在模拟器上运行此代码时,它运行得很好,但它在真实设备上崩溃了吗?

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)
    }
}

3 个答案:

答案 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上的“样式”选项。它们用于从日期创建面向用户的字符串,绝不应该用于将字符串转换为日期。