如何从Xamarin.iOS中的iOS-Extension调用NSUserDefaults Observer

问题描述 投票:0回答:1

我尝试将图片从iPhone上传到我的Xamarin-PCL-App。我正在使用Share-Extension和iOS App-groups。当Extension更改某些内容时,不会调用关于更改NSUserDefaults的我的Main-App Observer。

我尝试将图片从iPhone上传到我的Xamarin-PCL-App。我正在使用Share-Extension。我已经实现了扩展,它工作正常。点击共享按钮后,我可以选择我的应用程序作为galery中的目标。调用Extension的DidSelectPost()事件,我可以在iPhone上显示消息。现在我想进入我的主应用程序来处理传入的图片。我在我的应用程序和扩展中添加了一个app-group(在entitlement.plist文件中已经存在)。现在我应该可以通过NSUserDefaults让Main-App和Extension进行通信,对吗?

我在FinishedLaunching的Main-Apps AppDelegate中添加了以下代码:

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

它应该在名为“rate”的NSUserDefaults键中进行调用。如果我在Main-App中更改此值,则调用Event。

我在ViewContollers中添加了一个简单的更改(类型:SLComposeServiceViewController)DidSelectPost函数:

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

我的主应用程序只是没有得到改变。

提前致谢!

ios xamarin nsuserdefaults sharing ios-app-group
1个回答
0
投票

您应该在更改值的位置添加AddObserver,例如您使用的ViewContollers

主要应用AppDelegate:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.