美文网首页iOS用到的iOS资料买不来的iOS实用技巧
iOS8扩展--Widget纯代码实现(小白级)

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

作者: 舒耀 | 来源:发表于2016-04-27 20:25 被阅读911次
    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

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

    相关文章

      网友评论

      • 柏林日记:如何实现和主项目共享公共类呢?勾选target之后一直报错
      • 北暖37:你好,我放了三个button,点击之后到启动页迅速的就回答了手机主页, [self.extensionContext openURL:[NSURL URLWithString:@"FubeiWidget://action=richScan"] completionHandler:^(BOOL success) {
        这个方法打印的success为0,但是appdelegate的openurl方法没有执行,这是什么原因呢
      • 是秋天阿:请问,button 为什么不可以设置图片呢
      • 萧城x:qqmusic
      • 萧城x:想qq那些 播放音乐的锁屏的界面 在哪里写的
        萧城x: 多谢
        舒耀:@低调做事 http://www.jianshu.com/p/3fb9a8c4b1b1 你看看这个人写的对你有没有帮助。
      • Zeke权:仿佛看到了TVB
        Zeke权:@舒耀 你的应用程序图标,看着像TVB
        舒耀:@熊格智障 啥意思?:joy::joy:
      • 别问为什么: 试着自己写,但是到 -在主plist文件里面设置协议- 这一步就不知道该填什么了....囧...
        别问为什么:@舒耀 是因为以前没用过URL Scheme,不知道各个项的作用,百度了下,已搞定...
        舒耀:@别问为什么 右键 有个Add row 然后添加然后根据那个我放的图 设置key value 就可以 ,不明白可以再问我
      • 何止玉树临风:占坑,回头写个demo 试试
      • Cuffy:mark

      本文标题:iOS8扩展--Widget纯代码实现(小白级)

      本文链接:https://www.haomeiwen.com/subject/lticrttx.html