我尝试将图片从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();
我的主应用程序只是没有得到改变。
提前致谢!
您应该在更改值的位置添加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);
}