2017-06-20 1 views
0

Ich habe ein Problem, bei dem entweder der Erinnerungskalender oder der Ereigniskalender, je nachdem, welches Popup zuerst angezeigt wird, mehrere Kalender erstellt und keine der Ereignisse/Erinnerungen speichert. Ich habe die Eigenschaften im Plist eingestellt. Unten ist der Code, den ich Zugriff auf die Ereignisse und Erinnerungen verlangen bin mit:Xamarin iOS EventStore.Getcalendars Rückgabe 0

  var calendarEvent = await ANApi.FetchCalendarInfoAsync(AppCore.CurrentAppInfo.AppId); 
      calendarEvent.Count(); 

      foreach (var calEvent in calendarEvent.ToList()) 
      { 
       if (calEvent.Type == 1) 
       { 
        AppEvent.Current.EventStore.RequestAccess(EKEntityType.Event, (bool granted, NSError err) => 
         { 
          if (granted) 
          { 
           lock (_lock) 
           { 
            CreateCalendar(EKEntityType.Event); 
            CreateEvent(calEvent); 
           } 
          } 

         }); 
       } 
       else 
       { 
        AppEvent.Current.EventStore.RequestAccess(EKEntityType.Reminder, (bool remGranted, NSError remErr) => 
        { 
         if (remGranted) 
         { 
          lock (_lock) 
          { 
           CreateCalendar(EKEntityType.Reminder); 
           CreateReminder(calEvent); 
          } 
         } 
        }); 
       } 
      } 

Der Code funktioniert gut, wenn ich nur Ereignisse oder Erinnerungen empfangen, aber da ich beiden Ereignisse und Erinnerungen empfängt, wird es andernfalls zu Erstelle meine Kalender richtig.

Dies ist, wie ich die Kalender erschaffe:

public void CreateCalendar(EKEntityType type) 
    { 
     bool calExists = false; 
     var appName = NSBundle.MainBundle.ObjectForInfoDictionary("CFBundleDisplayName"); 

     //This returns 0 calendars, depending on which event's request was displayed first. 
     EKCalendar[] calendars = AppEvent.Current.EventStore.GetCalendars(type); 
     foreach (EKCalendar cal in calendars) 
     { 
      if (type == EKEntityType.Event) 
      { 
       if (PersistentLayer.Instance.GetString(Constant.CALENDAR_ID) == null) 
        calExists = false; 
       else if (cal.CalendarIdentifier == PersistentLayer.Instance.GetString(Constant.CALENDAR_ID)) 
        calExists = true; 
      } 
      else 
      { 
       if (PersistentLayer.Instance.GetString(Constant.REMINDER_CALENDAR_ID) == null) 
        calExists = false; 
       else if (cal.CalendarIdentifier == PersistentLayer.Instance.GetString(Constant.REMINDER_CALENDAR_ID)) 
        calExists = true; 
      } 
     } 
     //Create a Calendar based on the App's name. If name cannot be found use App Calendar 
     if (!calExists) 
     { 
      EKCalendar calendar = EKCalendar.Create(type, AppEvent.Current.EventStore); 

      if (appName != null) 
       calendar.Title = appName.ToString(); 
      else 
       calendar.Title = "App"; 
      EKSource localSource = null; 

      foreach (EKSource source in AppEvent.Current.EventStore.Sources) 
      { 
       if (source.SourceType == EKSourceType.CalDav) 
       { 
        localSource = source; 
        break; 
       } 
      } 

      if (localSource == null) 
       return; 

      calendar.Source = localSource; 
      calendar.CGColor = new CGColor(255, 255, 0); 
      NSError calError; 

      AppEvent.Current.EventStore.SaveCalendar(calendar, true, out calError); 
      if (calError != null) 
      { 
       this.SimpleAlert("Error saving Calender", calError.ToString(), "OK", null); 
       return; 
      } 

      //Store the calendar Id so we can use it when saving events 
      if (type == EKEntityType.Event) 
       PersistentLayer.Instance.Edit().PutString(Constant.CALENDAR_ID, calendar.CalendarIdentifier); 
      else 
       PersistentLayer.Instance.Edit().PutString(Constant.REMINDER_CALENDAR_ID, calendar.CalendarIdentifier); 
     } 
    } 

Ich glaube, dass es irgendeine Art von Rennen Zustand geht, aber ich habe nicht in der Lage gewesen, um es herauszufinden. Ich habe mehrere Dinge ausprobiert, um es zum Laufen zu bringen, aber ich hatte keinen Erfolg.

Dank

Antwort

0

Ich landete herauszufinden, es. Zuerst brach ich den Code auf und erstellte alle Erinnerungen, die von den Ereignissen gefolgt wurden.

Zuerst gab mir das eine Fehler Domain = EKCADErrorDomain Code = 1010 beim Versuch, die Ereignisse zu erstellen. Die Art, wie ich das gelöst habe, war das Zurücksetzen des Ereignisspeichers. Nachdem ich dies getan hatte, wurden die Kalender ordnungsgemäß erstellt, sowohl für Erinnerungen als auch für Ereignisse, und sowohl Ereignisse als auch Erinnerungen wurden ihren jeweiligen Kalendern hinzugefügt.