iOS8擴(kuò)展--Widget純代碼實(shí)現(xiàn)(小白級(jí))

widget.png

Widget如上圖所示,我是用純代碼實(shí)現(xiàn)的,網(wǎng)上也有教程自己試著做了一下,第一次做坑不少,一天就做了這點(diǎn)東西。由于自己是小白,希望能和大神多交流,因?yàn)槲矣X(jué)得自己對(duì)代碼的理解有時(shí)候比好多人慢,沒(méi)法子農(nóng)村人營(yíng)養(yǎng)沒(méi)跟上~~~
1、Widget如何創(chuàng)建?
2、Widget實(shí)現(xiàn)數(shù)據(jù)共享
3、Widget放置圖片
目前這是我遇到的三個(gè)比較大的問(wèn)題,就拿放置圖片來(lái)說(shuō)(圖片“購(gòu)”那張圖片),終于在加班訂飯的時(shí)候解決了。是的,程序汪加班苦逼啊
開(kāi)始吧,Let‘ go
第一部分:創(chuàng)建Widget
1、用Xcode打開(kāi)項(xiàng)目,選擇File->New->Target,選擇Today Extension;


創(chuàng)建Widget.png

2、最后在項(xiàng)目目錄里面就能看到我們新建的插件,其中圖片是后加的

創(chuàng)建完成.png

本人習(xí)慣純代碼書(shū)寫(xiě),所以刪除MainInterface.storyboard,修改它的plist文件,不是主應(yīng)用的plist文件
【1】刪掉NSExtensionMainStoryboard字段
【2】添加NSExtensionPrincipalClass字段 并設(shè)為T(mén)odayViewController(你也可以指定其他的ViewController)


刪除storyboard.jpg

第二部分進(jìn)行我們想要的布局
1、需要注意的地方是,extension中view的位置不是最左邊開(kāi)始的,而是默認(rèn)從icon后開(kāi)始的,所以如需修改,代碼入下:

  • (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
    {
    return UIEdgeInsetsZero;
    }
    2、依次放三個(gè)Button,分別是打開(kāi)首頁(yè)、打開(kāi)消息、打開(kāi)詳情,這三個(gè)按鈕將從widget跳轉(zhuǎn)到APP的指定頁(yè),通過(guò)OpenUrl方法,self.extensionContext其實(shí)就是Today這個(gè)app,然后有Today和主應(yīng)用進(jìn)行進(jìn)程間通訊,里面很復(fù)雜,但方法封裝的很簡(jiǎn)單,就是OpenUrl:

這里需要在主plist文件里面設(shè)置協(xié)議,一定要注意是主plist,因?yàn)閯?chuàng)建Widget也會(huì)創(chuàng)建一個(gè)plist文件,就叫輔plist吧

設(shè)置協(xié)議.jpg

在Button的點(diǎn)擊事件里進(jìn)行如下操作:

    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) {
       
    }];

}

然后在主應(yīng)用的AppDelegate解析協(xié)議,進(jìn)行不同的操作。

  • (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];
        //跳轉(zhuǎn)到home
    if ([action isEqualToString:@"GotoHomePage"]) {
        RDVTabBarController *tabBarController = (RDVTabBarController*)self.window.rootViewController;
        [tabBarController setSelectedIndex:0];
        //跳轉(zhuǎn)到Message
    } else if ([action isEqualToString:@"GotoMessage"]){
        RDVTabBarController *tabBarController = (RDVTabBarController*)self.window.rootViewController;
        [tabBarController setSelectedIndex:1];
        //跳轉(zhuǎn)到詳情頁(yè)
    } else {
        UINavigationController *na = (UINavigationController *)[[UIApplication sharedApplication].keyWindow rootViewController];
        DetailViewController *detailVC = [[DetailViewController alloc] init];
        [na presentViewController:detailVC animated:YES completion:^{
            
        }];
    }
}
return YES;

現(xiàn)在就可以跳轉(zhuǎn)了,當(dāng)然你得應(yīng)用要已經(jīng)創(chuàng)建好了要跳轉(zhuǎn)的頁(yè)面

第三部分共享數(shù)據(jù)
1、今日插件怎么能獲取主應(yīng)用的數(shù)據(jù)呢?要知道插件和主應(yīng)用是獨(dú)立的兩個(gè)進(jìn)程,以前是無(wú)法共享數(shù)據(jù)的,現(xiàn)在可以通過(guò)AppGroup來(lái)共享數(shù)據(jù),同屬于一個(gè)group的App共同訪問(wèn)并修改某個(gè)數(shù)據(jù)。

設(shè)置APP Groups.png

2、讀寫(xiě)數(shù)據(jù)
通過(guò)NSUserDefaults來(lái)讀寫(xiě)數(shù)據(jù),注意NSUserDefaults是根據(jù)剛才創(chuàng)建的group來(lái)創(chuàng)建的。我們?cè)谥鲬?yīng)用里加入如下代碼,這樣今日插件就有數(shù)據(jù)可讀了。

NSUserDefaults *ud = [[NSUserDefaults alloc] initWithSuiteName:@"group.love"];
NSString *str = @"This is a text!!!!!!!!!!!!!";
[ud setObject:str forKey:@"group.love.message"];
[ud synchronize];

Widget顯示主應(yīng)用中的數(shù)據(jù)

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;

這樣下來(lái)基本完成了,就剩下一個(gè)圖片了,我就在這里要到了個(gè)坑

UIImageView *loveImage = [[UIImageView alloc] initWithFrame:CGRectMake(60, 50, 30, 30)];
loveImage.image = [UIImage imageNamed:@"0yjd"];
[self.view addSubview:loveImage];

就是這樣啊,沒(méi)問(wèn)題啊,為什么不顯示,然后給他設(shè)置一個(gè)背景顏色,哎呦,有啊,就是設(shè)置圖片時(shí)一百個(gè)不顯示,可是他就是不顯示,理論上應(yīng)該顯示,理論只是理論,需要實(shí)踐見(jiàn)真知,還記得這個(gè)圖吧,是的你需要把需要顯示的本地圖片加到創(chuàng)建的Widget文件夾下,就好了

創(chuàng)建完成.png

這是我遇到的幾個(gè)問(wèn)題,比較小白,比如聯(lián)網(wǎng)實(shí)時(shí)獲取數(shù)據(jù)顯示,還沒(méi)搞,如果有人搞完了,說(shuō)一下,大家看看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容