如何从 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 - 如何从硬件键盘禁用选项卡键码

如何从 Xamarin iOS 中选择和打开可用的导航应用程序?

如何从 Xamarin.ios 访问 UIImagePickerController 快门 UiButton

如何在 Xamarin(iOS) 中将按钮从右向左移动

如何解释 Xamarin.iOS 中的 NetworkReachabilityFlags?