NotificationCenter

2024-06-06 12:58
文章标签 notificationcenter

本文主要是介绍NotificationCenter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NotificationCenter

NotificationCenter 框架提供了实现桌面通知中心组件的接口,主要包含一个类和一个协议。

NCWidgetController

该类主要用来设置桌面中的组件是应该隐藏还是显示,例如,在点击组件跳转到主应用程序后,需要隐藏组件。

或者,在使用主应用程序添加某些事项后,需要其显示在桌面组件中。

+ (instancetype)widgetController;- (void)setHasContent:(BOOL)flag forWidgetWithBundleIdentifier:(NSString *)bundleID;

NCWidgetController 虽然以 Controller 结尾,但其父类是 NSObject

NCWidgetProviding

该协议主要定义了两个方法,通过这两个方法,可以更新组件状态。

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult result))completionHandler;- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);

组件默认高度是固定的 110 个点,可以通过修改 NSExtensionContextNCWidgetAdditions 分类中的属性值来使组件支持折叠和展开。

@property (nonatomic, assign) NCWidgetDisplayMode widgetLargestAvailableDisplayMode NS_AVAILABLE_IOS(10_0);
@property (nonatomic, assign, readonly) NCWidgetDisplayMode widgetActiveDisplayMode NS_AVAILABLE_IOS(10_0);

修改属性 widgetLargestAvailableDisplayMode 的值可以将其设置为可以折叠和展开的,而 widgetActiveDisplayMode 属性值是只读的,实时表示当前的组件是处于折叠状态还是展开状态,他实际与上面的协议方法中的 activeDisplayMode 参数的值是一致的。

NCWidgetDisplayMode 是枚举值,其包含两个值,分别表示固定高度和可折叠。

typedef NS_ENUM(NSInteger, NCWidgetDisplayMode) {NCWidgetDisplayModeCompact, // Fixed heightNCWidgetDisplayModeExpanded, // Variable height
} NS_ENUM_AVAILABLE_IOS(10_0);

使用

组件的创建十分简单,其作为一个应用的扩展,只能在创建一个应用之后,创建一个 target ,并选择 Today Extention 扩展。

模版会自动创建一个 TodayViewController 类,并且遵循 NCWidgetProviding 协议。

viewDidLoad 方法中将组件设置为可折叠的。

- (void)viewDidLoad {[super viewDidLoad];NSExtensionContext *context = [self extensionContext];context.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
}

实现 NCWidgetProviding 协议中的方法,根据不同状态来设置 preferredContentSize 的值,从而改变组件的高度。

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayModewithMaximumSize:(CGSize)maxSize {if (activeDisplayMode == NCWidgetDisplayModeExpanded) {self.preferredContentSize = CGSizeMake(maxSize.width, 600);}else {self.preferredContentSize = maxSize;}
}

之后,为组件添加一个点击事件,使其跳转到主应用程序中,并且隐藏组件,在 10 秒后再次显示组件。

- (IBAction)btnClickedOfOpen:(UIButton *)sender {NSExtensionContext *context = [self extensionContext];[context openURL:[NSURL URLWithString:@"HXDemo://title=test&content=111111"]completionHandler:^(BOOL success) {[self showOrHideWidget:NO];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self showOrHideWidget:YES];});}];
}- (void)showOrHideWidget:(BOOL)isShow {NSString *bundleID = [[NSBundle mainBundle]objectForInfoDictionaryKey:(NSString *)kCFBundleIdentifierKey];[[NCWidgetController widgetController]setHasContent:isShow forWidgetWithBundleIdentifier:bundleID];
}

这里实现跳转的方式,类似于不同应用间的跳转,需要先在主应用程序中添加指定的协议名称。


参考文章:

Widget开发指南

iOS开发之构建Widget

Widget

A Tutorial on iOS 8 App Extensions

URL Scheme是如何实现app之间的跳转

Inter-AppCommunication

这篇关于NotificationCenter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036171

相关文章

对象间的通信之delegate、notificationCenter与block

在项目开发中,常常会涉及到对象之间的通信,而为了降低对象间的耦合,会采用delegate、notificationCenter、block三种方式来进行实现,对于他们的使用,也许大家都能熟练掌握,但是对于如何创建,初学者也许只是一知半解,本文不讲长篇大论,仅通过简单的实例来帮助大家学习三者的使用,希望对尚不了解以上三者的朋友能带来一定的帮助。 一、delegate 估计大家最常用的del

Flutter中的NotificationCenter和EventBus(超级简单!)

废话不都说,123,直接上连接 Github: https://github.com/VictorZhang2014/NotificationCentre Flutter的pub:https://pub.dev/packages/notification_centre 这么多年了,Flutter要想想自己的问题,为什么不出一个官方的版本呢?所以在此博主就免费献给大家了。 -- 摘自李佳琦直