首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Xamarin.iOS中从iOS-Extension调用NSUserDefaults观察者

如何在Xamarin.iOS中从iOS-Extension调用NSUserDefaults观察者
EN

Stack Overflow用户
提问于 2019-03-28 19:41:35
回答 1查看 398关注 0票数 1

我尝试将图片从iPhone上传到我的Xamarin-PCL-App。我使用的是Share-Extension和iOS应用组。当扩展发生变化时,我的Main-App when on changing NSUserDefaults不会被调用。

我尝试将图片从iPhone上传到我的Xamarin-PCL-App。我使用的是共享扩展。我已经实现了这个扩展,它工作得很好。点击共享按钮后,我可以在galery中选择我的应用程序作为目标。扩展的DidSelectPost()事件被调用,我可以在iPhone上显示一条消息。现在我想进入我的Main-App来处理传入的图片。我添加了一个应用程序组到我的应用程序和扩展(在entitlement.plist文件中,它已经在那里)。现在我应该能够让主应用程序和扩展程序通过NSUserDefaults通信了,对吧?

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

代码语言:javascript
复制
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密钥发生变化时调用它。如果我在Main-App中改变这个值,事件就会被调用。

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

代码语言:javascript
复制
NSUserDefaults shared = new NSUserDefaults("group.de.companyname.appname", NSUserDefaultsType.SuiteName);
shared.SetString("test", "rate");
            shared.Synchronize();

我的Main-App就是得不到这些改变。

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2019-03-29 15:29:02

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

Main-应用程序AppDelegate

代码语言:javascript
复制
var userDefaults = NSUserDefaults.StandardUserDefaults;
shared.SetString("testOldData", "rate");
shared.Synchronize();

ViewContollers

代码语言:javascript
复制
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();
}

当值发生变化时,可以调用此方法:

代码语言:javascript
复制
//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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55396730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档