
Widget如上圖所示,我是用純代碼實現的,網上也有教程自己試著做了一下,第一次做坑不少,一天就做了這點東西。由于自己是小白,希望能和大神多交流,因為我覺得自己對代碼的理解有時候比好多人慢,沒法子農村人營養(yǎng)沒跟上~~~
1、Widget如何創(chuàng)建?
2、Widget實現數據共享
3、Widget放置圖片
目前這是我遇到的三個比較大的問題,就拿放置圖片來說(圖片“購”那張圖片),終于在加班訂飯的時候解決了。是的,程序汪加班苦逼啊
開始吧,Let‘ go
第一部分:創(chuàng)建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,因為創(chuàng)建Widget也會創(chuàng)建一個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;
現在就可以跳轉了,當然你得應用要已經創(chuàng)建好了要跳轉的頁面
第三部分共享數據
1、今日插件怎么能獲取主應用的數據呢?要知道插件和主應用是獨立的兩個進程,以前是無法共享數據的,現在可以通過AppGroup來共享數據,同屬于一個group的App共同訪問并修改某個數據。

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

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