如何从 Xamarin.iOS 中的 iOS 扩展调用 NSUserDefaults Observer
Posted
技术标签:
【中文标题】如何从 Xamarin.iOS 中的 iOS 扩展调用 NSUserDefaults Observer【英文标题】:How to call NSUserDefaults Observer from iOS-Extension in Xamarin.iOS 【发布时间】:2019-03-28 11:41:34 【问题描述】:我尝试将图片从 iPhone 上传到我的 Xamarin-PCL-App。 我正在使用共享扩展和 ios 应用程序组。 当扩展更改某些内容时,不会调用我更改 NSUserDefaults 的 Main-App Observer。
我尝试将图片从 iPhone 上传到我的 Xamarin-PCL-App。 我正在使用共享扩展。 我已经实现了扩展,它工作正常。 单击共享按钮后,我可以在图库中选择我的应用程序作为目标。 扩展的 DidSelectPost() 事件被调用,我可以在 iPhone 上显示一条消息。 现在我想进入我的主应用程序来处理传入的图片。 我向我的应用程序和扩展添加了一个应用程序组(在 entitlement.plist 文件中它已经存在)。 现在我应该可以让 Main-App 和 Extension 通过 NSUserDefaults 进行通信了,对吧?
我在 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 键更改时调用。 如果我在主应用程序中更改此值,则会调用事件。
我在ViewContollers(类型:SLComposeServiceViewController)DidSelectPost函数中添加了一个简单的变化:
NSUserDefaults shared = new NSUserDefaults("group.de.companyname.appname", NSUserDefaultsType.SuiteName);
shared.SetString("test", "rate");
shared.Synchronize();
我的主应用程序没有得到更改。
提前致谢!
【问题讨论】:
【参考方案1】:您应该在更改值的位置AddObserver,例如您使用的ViewContollers
。
主应用 AppDelegate:
var userDefaults = NSUserDefaults.StandardUserDefaults;
shared.SetString("testOldData", "rate");
shared.Synchronize();
视图控制器:
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);
【讨论】:
谢谢@Junior Jiang - MSFT 我在我的程序中添加了你的代码,但它仍然什么也没做。知道为什么吗? 知道了,建议用NSUserDefaults shared=SUserDefaults.StandardUserDefaults;
代替NSUserDefaults shared = new NSUserDefaults("group.de.companyname.appname", NSUserDefaultsType.SuiteName);
试试。我会更新答案。@L.B.
什么都没有发生..我仍然不知道我做错了什么:(
@L.B.嗯,你可以发布你的示例项目。我会检查它。以上是关于如何从 Xamarin.iOS 中的 iOS 扩展调用 NSUserDefaults Observer的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin / iOS - 如何从硬件键盘禁用选项卡键码
如何从 Xamarin iOS 中选择和打开可用的导航应用程序?