Widget如上图所示,我是用纯代码实现的,网上也有教程自己试着做了一下,第一次做坑不少,一天就做了这点东西。由于自己是小白,希望能和大神多交流,因为我觉得自己对代码的理解有时候比好多人慢,没法子农村人营养没跟上~~~
1、Widget如何创建?
2、Widget实现数据共享
3、Widget放置图片
目前这是我遇到的三个比较大的问题,就拿放置图片来说(图片“购”那张图片),终于在加班订饭的时候解决了。是的,程序汪加班苦逼啊
开始吧,Let‘ go
第一部分:创建Widget
1、用Xcode打开项目,选择File->New->Target,选择Today Extension;
2、最后在项目目录里面就能看到我们新建的插件,其中图片是后加的
本人习惯纯代码书写,所以删除MainInterface.storyboard,修改它的plist文件,不是主应用的plist文件
【1】删掉NSExtensionMainStoryboard字段
【2】添加NSExtensionPrincipalClass字段 并设为TodayViewController(你也可以指定其他的ViewController)
第二部分进行我们想要的布局
1、需要注意的地方是,extension中view的位置不是最左边开始的,而是默认从icon后开始的,所以如需修改,代码入下:
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
return UIEdgeInsetsZero;
}
2、依次放三个Button,分别是打开首页、打开消息、打开详情,这三个按钮将从widget跳转到APP的指定页,通过OpenUrl方法,self.extensionContext其实就是Today这个app,然后有Today和主应用进行进程间通讯,里面很复杂,但方法封装的很简单,就是OpenUrl:
这里需要在主plist文件里面设置协议,一定要注意是主plist,因为创建Widget也会创建一个plist文件,就叫辅plist吧
在Button的点击事件里进行如下操作:
if (sender.tag == 0) {
[self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://action=GotoHomePage"] completionHandler:^(BOOL success) {
}];
} else if (sender.tag == 1){
[self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://action=GotoMessage"] completionHandler:^(BOOL success) {
}];
} else {
[self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://action=GotoDetail"] completionHandler:^(BOOL success) {
}];
}
然后在主应用的AppDelegate解析协议,进行不同的操作。
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
NSString* prefix = @"iOSWidgetApp://action=";
if ([[url absoluteString] rangeOfString:prefix].location!=NSNotFound) {
NSString *action = [[url absoluteString] substringFromIndex:prefix.length];
//跳转到home
if ([action isEqualToString:@"GotoHomePage"]) {
RDVTabBarController *tabBarController = (RDVTabBarController*)self.window.rootViewController;
[tabBarController setSelectedIndex:0];
//跳转到Message
} else if ([action isEqualToString:@"GotoMessage"]){
RDVTabBarController *tabBarController = (RDVTabBarController*)self.window.rootViewController;
[tabBarController setSelectedIndex:1];
//跳转到详情页
} else {
UINavigationController *na = (UINavigationController *)[[UIApplication sharedApplication].keyWindow rootViewController];
DetailViewController *detailVC = [[DetailViewController alloc] init];
[na presentViewController:detailVC animated:YES completion:^{
}];
}
}
return YES;
现在就可以跳转了,当然你得应用要已经创建好了要跳转的页面
第三部分共享数据
1、今日插件怎么能获取主应用的数据呢?要知道插件和主应用是独立的两个进程,以前是无法共享数据的,现在可以通过AppGroup来共享数据,同属于一个group的App共同访问并修改某个数据。
2、读写数据
通过NSUserDefaults来读写数据,注意NSUserDefaults是根据刚才创建的group来创建的。我们在主应用里加入如下代码,这样今日插件就有数据可读了。
NSUserDefaults *ud = [[NSUserDefaults alloc] initWithSuiteName:@"group.love"];
NSString *str = @"This is a text!!!!!!!!!!!!!";
[ud setObject:str forKey:@"group.love.message"];
[ud synchronize];
Widget显示主应用中的数据
NSUserDefaults *ud = [[NSUserDefaults alloc] initWithSuiteName:@"group.love"];
NSString *text = [ud objectForKey:@"group.love.message"];
UILabel *textLable = [[UILabel alloc] initWithFrame:CGRectMake(100, 50, 200, 30)];
textLable.textColor = [UIColor whiteColor];
textLable.textAlignment = 1;
[self.view addSubview:textLable];
textLable.text = text;
这样下来基本完成了,就剩下一个图片了,我就在这里要到了个坑
UIImageView *loveImage = [[UIImageView alloc] initWithFrame:CGRectMake(60, 50, 30, 30)];
loveImage.image = [UIImage imageNamed:@"0yjd"];
[self.view addSubview:loveImage];
就是这样啊,没问题啊,为什么不显示,然后给他设置一个背景颜色,哎呦,有啊,就是设置图片时一百个不显示,可是他就是不显示,理论上应该显示,理论只是理论,需要实践见真知,还记得这个图吧,是的你需要把需要显示的本地图片加到创建的Widget文件夹下,就好了
这是我遇到的几个问题,比较小白,比如联网实时获取数据显示,还没搞,如果有人搞完了,说一下,大家看看