iOS8擴展--Widget純代碼實現(小白級)

widget.png

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


創(chuàng)建Widget.png

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

創(chuàng)建完成.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,因為創(chuàng)建Widget也會創(chuàng)建一個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;

現在就可以跳轉了,當然你得應用要已經創(chuàng)建好了要跳轉的頁面

第三部分共享數據
1、今日插件怎么能獲取主應用的數據呢?要知道插件和主應用是獨立的兩個進程,以前是無法共享數據的,現在可以通過AppGroup來共享數據,同屬于一個group的App共同訪問并修改某個數據。

設置APP Groups.png

2、讀寫數據
通過NSUserDefaults來讀寫數據,注意NSUserDefaults是根據剛才創(chuàng)建的group來創(chuàng)建的。我們在主應用里加入如下代碼,這樣今日插件就有數據可讀了。

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];

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

創(chuàng)建完成.png

這是我遇到的幾個問題,比較小白,比如聯網實時獲取數據顯示,還沒搞,如果有人搞完了,說一下,大家看看

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容