Доступ к iCloud NSUbiquitousKeyValueStoreDidChange Внешние подробности уведомления из MonoTouch - PullRequest
3 голосов
/ 07 февраля 2012

В MonoTouch я хотел бы получить доступ к данным уведомления NSUbiquitousKeyValueStoreDidChangeExternallyNotification (входящее обновление значения ключа iOS5 / iCloud):

  • NSUbiquitousKeyValueStoreChangeReasonKey -> NSNumber *KysKeyBeBSHeBeSHeBeBeBS *1504*NSString

Существует пример @ http://docs.xamarin.com/@api/deki/files/321/=iCloud.zip,, но код для доступа выше закомментирован и содержит ошибки (то, как он пытается преобразовать причину в целое число, неверно).Я здесь близко:

NSNotificationCenter.DefaultCenter.AddObserver(new NSString("NSUbiquitousKeyValueStoreDidChangeExternallyNotification"), 
delegate(NSNotification n)  
{
    NSDictionary userInfo = n.UserInfo;
    NSNumber reason = (NSNumber)userInfo.ObjectForKey(
        new NSString("NSUbiquitousKeyValueStoreChangeReasonKey"));
    int ireason = reason.IntValue;
    NSArray changedKeys = (NSArray)userInfo.ObjectForKey(
        new NSString("NSUbiquitousKeyValueStoreChangedKeysKey"));
});

Я понял, как получить разум как целое число.Но как мне преобразовать NSArray из NSStrings в простую строку [] ??Мне никогда раньше не приходилось работать с основными оболочками типа Objective-C, извините.

1 Ответ

5 голосов
/ 07 февраля 2012

Надеюсь, что это поможет ~ использует IntPtr, возвращенный из метода NSArray.ValueAt (), чтобы создать новую строку NSString и получить доступ к нужным значениям.

NSNotificationCenter.DefaultCenter.AddObserver (
    NSUbiquitousKeyValueStore.DidChangeExternallyNotification
    , delegate (NSNotification n)
{
    Console.WriteLine("Cloud notification received");
    NSDictionary userInfo = n.UserInfo;

    NSNumber reason = (NSNumber)userInfo.ObjectForKey(NSUbiquitousKeyValueStore.ChangeReasonKey);
    int ireason = reason.IntValue;
    Console.WriteLine("reason.IntValue: " + ireason);

    NSArray changedKeys = (NSArray)userInfo.ObjectForKey (NSUbiquitousKeyValueStore.ChangedKeysKey);
    var changedKeysList = new System.Collections.Generic.List<string> ();
    for (uint i = 0; i < changedKeys.Count; i++)
    {
        var key = new NSString (changedKeys.ValueAt(i));
        Console.WriteLine("changedKey IntPtr: " + changedKeys.ValueAt(i));
        Console.WriteLine("changedKey (value): " + key);

        changedKeysList.Add (key);
    }
    // now do something with the list...
});
...