Как вызвать NSUserDefaults Observer из iOS-расширения в Xamarin.iOS - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь загрузить изображения с iPhone в мое приложение Xamarin-PCL. Я использую Share-Extension и iOS App-группы. Мой Main-App Observer при изменении NSUserDefaults не вызывается, когда расширение что-то меняет.

Я пытаюсь загрузить изображения с iPhone в мое приложение Xamarin-PCL. Я использую Share-Extension. Я уже реализовал расширение, оно работает нормально. Я могу выбрать приложение в качестве цели в галерее после нажатия кнопки «Поделиться». Событие DidSelectPost () расширения вызывается, и я могу показать сообщение на iPhone. Теперь я хочу войти в главное приложение для обработки входящего изображения. Я добавил группу приложений в свое приложение и расширение (в файлах authorlement.plist она уже есть). Теперь я должен позволить Main-App и Extension общаться через NSUserDefaults, верно?

Я добавил следующий код в документ приложения Main-Apps в FinishedLaunching:

var userDefaults = new NSUserDefaults("group.de.companyname.appname", NSUserDefaultsType.SuiteName);
            userDefaults.AddObserver("rate", NSKeyValueObservingOptions.Prior, note =>
            {
                NSUserDefaults shared = new NSUserDefaults("group.de.companyname.appname", NSUserDefaultsType.SuiteName);
                var value = shared.ValueForKey(new NSString("rate"));
            });

Должен вызываться при изменении ключа NSUserDefaults с именем "rate". Если я изменяю это значение в главном приложении, вызывается событие.

Я добавил простое изменение в ViewContollers (Тип: SLComposeServiceViewController) Функция DidSelectPost:

NSUserDefaults shared = new NSUserDefaults("group.de.companyname.appname", NSUserDefaultsType.SuiteName);
shared.SetString("test", "rate");
            shared.Synchronize();

Мое главное приложение просто не получает изменений.

Заранее спасибо!

1 Ответ

0 голосов
/ 29 марта 2019

Вы должны AddObserver там, где вы изменили значение, например ViewContollers, который вы использовали.

Приложение Main-AppsDelegate :

var userDefaults = NSUserDefaults.StandardUserDefaults;
shared.SetString("testOldData", "rate");
shared.Synchronize();

ViewContollers :

public override void ViewDidLoad ()
{
base.ViewDidLoad ();

NSUserDefaults shared = NSUserDefaults.StandardUserDefaults;
shared.AddObserver(this, "Name", NSKeyValueObservingOptions.OldNew, IntPtr.Zero);
}

//Test Changing the value
public override void ViewDidAppear(bool animated)
{ 
base.ViewDidAppear(animated);
NSUserDefaults shared = NSUserDefaults.StandardUserDefaults;
shared.SetString("testNewData", "rate");
shared.Synchronize();
}

И когда значение изменилось, этот метод может быть вызван:

//When value cahnged this will be invoked
public override void ObserveValue(NSString keyPath, NSObject ofObject, NSDictionary change, IntPtr context)
{
    if (keyPath == "Name")
    {
        Console.WriteLine("--old--" + change.ValueForKey(new NSString("old")));
        Console.WriteLine("--new--" + change.ValueForKey(new NSString("new")));
    }
    else
        base.ObserveValue(keyPath, ofObject, change, context);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...