iOS8扩展--Widget纯代码实现(小白级)

widget.png

Widget如上图所示,我是用纯代码实现的,网上也有教程自己试着做了一下,第一次做坑不少,一天就做了这点东西。由于自己是小白,希望能和大神多交流,因为我觉得自己对代码的理解有时候比好多人慢,没法子农村人营养没跟上~~~
1、Widget如何创建?
2、Widget实现数据共享
3、Widget放置图片
目前这是我遇到的三个比较大的问题,就拿放置图片来说(图片“购”那张图片),终于在加班订饭的时候解决了。是的,程序汪加班苦逼啊
开始吧,Let‘ go
第一部分:创建Widget
1、用Xcode打开项目,选择File->New->Target,选择Today Extension;


创建Widget.png

2、最后在项目目录里面就能看到我们新建的插件,其中图片是后加的

创建完成.png

本人习惯纯代码书写,所以删除MainInterface.storyboard,修改它的plist文件,不是主应用的plist文件
【1】删掉NSExtensionMainStoryboard字段
【2】添加NSExtensionPrincipalClass字段 并设为TodayViewController(你也可以指定其他的ViewController)


删除storyboard.jpg

第二部分进行我们想要的布局
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吧

设置协议.jpg

在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共同访问并修改某个数据。

设置APP Groups.png

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文件夹下,就好了

创建完成.png

这是我遇到的几个问题,比较小白,比如联网实时获取数据显示,还没搞,如果有人搞完了,说一下,大家看看

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容