datum aller locale notifications ändern

S

SpecialFighter

Aktives Mitglied
Thread Starter
Dabei seit
25.04.2012
Beiträge
1.139
Reaktionspunkte
20
Hallo zusammen,
gibt es eine Möglichkeit via swift, das FireDate Datum aller Locale Notifiaction auf x Uhr zu setzen?
Habe folgendes getestet - funktioniert allerdings nicht:
Code:
var app:UIApplication = UIApplication.sharedApplication()
       for oneEvent in app.scheduledLocalNotifications {
           var notification = oneEvent as! UILocalNotification
        
           // String aus Notification.FireDate formatieren
           var dateFormatter = NSDateFormatter()
           dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
           dateFormatter.dateFormat = "dd.MM.YYYY"
           var strDate = dateFormatter.stringFromDate(notification.fireDate!)
        
           // Neues NSDate Firedate aus String machen
           dateFormatter.dateFormat = "dd.MM.yyyy"
           var FormatNewFireDate = "\(strDate) 09:00:00"
           dateFormatter.dateFormat = "dd.MM.yyyy HH:mm:ss"
           var NewFireDate = dateFormatter.dateFromString(FormatNewFireDate)
        
           // Neues FireDate setzen
           notification.fireDate = NewFireDate!
       }
 
Hallo,

Du verwechselst da etwas…

Das Datum bestimmt den Zeitpunkt der Zustellung und nicht welche Zeit in der Mitteilungszentrale angezeigt wird.

Viele Grüße
 
moment - das firedate ist ein datum incl. uhrzeit, zudem die locale notifications ausgeführt werden soll.
und in diesem firedate möchte ich die uhrzeit ändern
 
Hallo,

über einen String zu gehen ist falsch.
Du benötigst NSDateComponents und setzt dann die Zeit mit setHour: etc.

Viele Grüße
 
wie genau müsste das aussehen? :)
 
Zum Beispiel so…

Viele Grüße

Code:
    // …
    
    NSDate *date = [NSDate date];
    
    if(date == nil)
    {
    
        return;
    
    }
    
    // …
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    if(calendar == nil)
    {
    
        return;
    
    }
    
    // …
    
    NSDateComponents *components = [calendar components:NSUIntegerMax
                                               fromDate:date];
    
    if(components == nil)
    {

        return;
    
    }
    
    // …

    [components setHour:1];
    
    [components setMinute:2];
    
    [components setSecond:3];
    
    // …
    
    date = [calendar dateFromComponents:components];
    
    // …
    
    NSLog(@"%@", date);
    
    // …
 
das hat aber leider sehr wenig mit Swift zu tun.
 
Also ich fasse zusammen:

Ich schreibe Dir die passende Klasse, die Du benötigst.
Ich mache Dir sogar ein Beispiel.

Du bekommst es nicht mal hin Objective-C zu Swift zu adaptieren!?
Es bleibt doch alles identisch. Zumal es perfekt die Verwendung von NSDateComponents aufzeigt.

Also Du bist vielleicht ne faule Socke…

Viele Grüße
 
das hat damit überhaupt nichts zu tun.
nur frage ich mich warum ich dies unbedingt so machen muss.

mit dem oben genannten code (etwas abgeändert) setze ich problemlos alle meine locale notification.
also gehe auch dort über einen String undd as klappt. wieso kann ich das dann nicht auch anwenden um das firedate zu ändern?
 
Was hat mit was nichts zutun?

Also wenn Du keine Hilfe möchtest, dann brauchst Du auch nicht zwei Mal den gleichen Thread hier starten.

Das mit dem String ist falsch. Basta ;-)
Was meinst Du warum Apple NSDateComponents erfunden hat.

Natürlich geht das via String. Warum es bei Dir nicht klappt, weiß ich nicht, weil ich mir das nicht mal anschaue.
Weil eben NSDateComponens die richtige Lösung ist und nicht irgendwelche Formatangaben.

Glaub es, oder glaub es nicht.
Statt Du Dich freust und die Qualität Deines Codes verbesserst.

Und dann noch Objective-C bemängeln, obwohl Du es fast 1:1 zu Swift übertragen kannst.
Da schreibt Dir jemand nen Beispiel.

Die Welt wird immer verrückter… :D

Viele Grüße
 
war ja nichts böse gemeint, vielen dank auch für deine Hilfe.
Versuche ja nur zu verstehen warum es mit Strings beim anlegen eines Locale Notificaton klappt, aber nicht beim Ändern.
Werde meinen Code nun auf NSDateComponents umstellen und schauen :)
 
Sääährr guhhht… :D

Viele Grüße
 
muss aber jetzt leider sagen, dass ich mit NSDateComponents das FireDate auch nicht geändert bekomme.
es bleibt beim alten FireDate
 
Wenn Du es gesetzt hast, dann hole es nochmals von der Nachricht ab, also nicht von Deinem Datum.
Dann lasse Dir das mal als Log ausgeben.
Damit weißt Du schon mal, ob es die Nachricht korrekt angenommen hat, oder eben nicht…

Aber immerhin hast Du jetzt den richtigen Weg implementiert.

Viele Grüße
 
habe es gesetzt und gebe danach alle locale notifications aus.
allerdings wird mir weiterhin das alte FireDate angezeigt.
 
Zeige mal bitte Deinen Code…

Anderenfalls, wenn es so ist wie Du sagst, dann würde der Setter nicht funktionieren.
Dazu müsstest Du bei der Apfel-Bude nen Bugreport erstellen.

Viele Grüße
 
Code:
var dateFormatter = NSDateFormatter()
        dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
        dateFormatter.dateFormat = "HH"
        var hour = dateFormatter.stringFromDate(timepicker.date)
        dateFormatter.dateFormat = "mm"
        var minute = dateFormatter.stringFromDate(timepicker.date)
      
        var gregorian:NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let unit: NSCalendarUnit = .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay
        var comps:NSDateComponents = gregorian.components(unit, fromDate: timepicker.date)
        comps.setValue(28, forComponent: NSCalendarUnit.CalendarUnitDay)
        comps.setValue(7, forComponent: NSCalendarUnit.CalendarUnitMonth)
        comps.setValue(2015, forComponent: NSCalendarUnit.CalendarUnitYear)
        comps.setValue(hour.toInt()!, forComponent: NSCalendarUnit.CalendarUnitHour)
        comps.setValue(minute.toInt()!, forComponent: NSCalendarUnit.CalendarUnitMinute)
        var NewFiredate : NSDate = gregorian.dateFromComponents(comps)!

var app:UIApplication = UIApplication.sharedApplication()
  for oneEvent in app.scheduledLocalNotifications {
  var notification = oneEvent as! UILocalNotification

  var localNotification = UILocalNotification()
  localNotification.fireDate = NewFiredate
  }
 
Den gesamten Kram mit dem "dateFormatter" kannst Du Dir doch sparen.
Jetzt machst Du Deine neue Erkenntnis mit dem alten Zeugs.
In dem Beispiel brauchst Du nur "CalendarUnitDay" setzen. Alle anderen Komponenten mußt Du nicht neu setzen.

Lasst Dir mal in der Schleife loggen : "%@ - %@", localNotification.fireDate, NewFiredate

Das Problem ist, dass Dein Code extrem fehleranfällig ist.
Zum Beispiel könnte "timepicker.date" schon nil sein und dann geht natürlich nichts.
Also prüfen…

Viele Grüße
 
wie entnehme ich denn mit CalenderUnitHour die Studen aus dem Timepicker.date?

so?:

Code:
 comps.setValue(comps.hour, forComponent: NSCalendarUnit.CalendarUnitHour)
        comps.setValue(comps.minute, forComponent: NSCalendarUnit.CalendarUnitMinute)
 
Zuletzt bearbeitet:
also habe jetzt folgenden Code, allerdings wird dadurch das FireDate der alten Notifications nicht geändert:

Code:
var gregorian:NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let unit: NSCalendarUnit = .CalendarUnitHour | .CalendarUnitMinute
        var comps:NSDateComponents = gregorian.components(unit, fromDate: timepicker.date)
       
        comps.setValue(28, forComponent: NSCalendarUnit.CalendarUnitDay)
        comps.setValue(7, forComponent: NSCalendarUnit.CalendarUnitMonth)
        comps.setValue(2015, forComponent: NSCalendarUnit.CalendarUnitYear)
        comps.setValue(comps.hour, forComponent: NSCalendarUnit.CalendarUnitHour)
        comps.setValue(comps.minute, forComponent: NSCalendarUnit.CalendarUnitMinute)
       
        var NewFiredate : NSDate = gregorian.dateFromComponents(comps)!
       
        var app:UIApplication = UIApplication.sharedApplication()
        for oneEvent in app.scheduledLocalNotifications {
            var notification = oneEvent as! UILocalNotification
            notification.fireDate = NewFiredate
        }
 
Zurück
Oben Unten