第3章主要介紹怎樣在Watch App的頁面上顯示iPhone程序裏的數據。主要操做的是「EMWatchOCDemo WatchKit Extension」這個文件夾,附源碼EMWatchOCDemo。git
若是你已經看過我在第1章推薦的blog,應該明白這個target主要是負責邏輯的,從iPhone App中獲取數據,調動Watch App顯示數據。github
默認是這個樣子的app
1、WathKit定義了一些專門用於Watch App的類,與UIKit的對好比下圖ide
2、整合Watch App和iPhone Appatom
一、新建Controllerspa
根據Interface.storyboard,我須要新建5個Controller。右鍵---New File---Cocoa Touch Class插件
新建的類默認有三個方法,[-awakeWithContext:]至關於[-viewDidLoad],[-willActivate]至關於[-viewWillAppear],[-didDeactivate]至關於[-viewDidDisappear],「至關於」一下是否是就很容易理解每一個方法中能進行什麼操做了?3d
建好這5個Controller以後,再次打開Interface.storyboard,在每一個storyboard Controller的Class屬性中填寫對應的類名,這種操做對於熟悉storyboard的開發者來講,應該都不陌生。code
附圖一張blog
二、將自定義的類與storyboard關聯起來以後,繼續關聯其餘的控件。
聲明插件變量Table,並在storyboard中進行關聯。
@property (weak, nonatomic) IBOutlet WKInterfaceTable *table;
建立自定義的Table Row Controller,右鍵---New File---Cocoa Touch Class---Subclass of 「NSObject」,聲明插件變量Label,在storyboard中將Table Row Controller和Label進行關聯。要記得填寫Table Row Controller的Identifier,在加載數據時會用到這個屬性。
三、接下來要進行每一個頁面的數據獲取了,我是在[-awakeWithContext:]中進行的數據獲取。
WKInterfaceController有個類方法[+ openParentApplication: reply:],用於向對應的iPhone App發起申請。
而對應的iPhone App要想檢測到這個請求,須要在AppDelegate中監聽 [- application: handleWatchKitExtensionRequest: reply:].
以菜單頁面MenuController爲例,當頁面加載時要先向iPhone App發起獲取是否登陸的申請,iPhone App收到申請,將是否登陸的值返給WatchKit Extension;若是沒有登陸,頁面上顯示「登陸」選項,若是登陸了,顯示「會話」「好友」「羣組」三個選項。
MenuController:
[WKInterfaceController openParentApplication:@{@"action":@"isLogined"} reply:^(NSDictionary *replyInfo, NSError *error) { BOOL isLogined = NO; if ([replyInfo count] > 0) { isLogined = [[replyInfo objectForKey:@"isLogined"] boolValue]; } if (isLogined) { NSDictionary *conversationInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"會話", @"title", nil]; NSDictionary *friendInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"好友", @"title", nil]; NSDictionary *groupInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"羣組", @"title", nil]; [self.dataSoure addObject:conversationInfo]; [self.dataSoure addObject:friendInfo]; [self.dataSoure addObject:groupInfo]; NSInteger count = [self.dataSoure count]; //@"RowType2Controller"就是上邊提到的Table Row Controller 的Identifier屬性 [self.table setNumberOfRows:[self.dataSoure count] withRowType:@"RowType2Controller"]; for (int i = 0; i < count; i++) { RowType2Controller *rowController = [self.table rowControllerAtIndex:i]; NSDictionary *dic = self.dataSoure[i]; NSString *title = dic[@"title"]; [rowController.titleLabel setText:title]; } } else{ //@"RowType2Controller"就是上邊提到的Table Row Controller 的Identifier屬性 [self.table setNumberOfRows:1 withRowType:@"RowType2Controller"]; RowType2Controller *rowController = [self.table rowControllerAtIndex:0]; [rowController.titleLabel setText:@"登陸"]; } }];
AppDelegate
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply { if ([userInfo count] > 0) { NSString *actionString = [userInfo objectForKey:@"action"]; EaseMob *easemob = [EaseMob sharedInstance]; if ([actionString isEqualToString:@"isLogined"]) { reply(@{@"isLogined":[NSNumber numberWithBool:[easemob.chatManager isLoggedIn]]}); } }
四、獲取到了數據,接下來要調用Watch App顯示數據了。
顯示數據主要用到了WKInterfaceTable。WKInterfaceTable相對於UITableView而言,能調用的接口少的可憐
WK_CLASS_AVAILABLE_IOS(8_2) @interface WKInterfaceTable : WKInterfaceObject - (void)setRowTypes:(NSArray *)rowTypes; // row names. size of array is number of rows - (void)setNumberOfRows:(NSInteger)numberOfRows withRowType:(NSString *)rowType; // repeating row name @property(nonatomic,readonly) NSInteger numberOfRows; - (id)rowControllerAtIndex:(NSInteger)index; - (void)insertRowsAtIndexes:(NSIndexSet *)rows withRowType:(NSString *)rowType; - (void)removeRowsAtIndexes:(NSIndexSet *)rows; - (void)scrollToRowAtIndex:(NSInteger)index; @end
- (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex; // row selection if controller has WKInterfaceTable property - (id)contextForSegueWithIdentifier:(NSString *)segueIdentifier inTable:(WKInterfaceTable *)table rowIndex:(NSInteger)rowIndex; - (NSArray *)contextsForSegueWithIdentifier:(NSString *)segueIdentifier inTable:(WKInterfaceTable *)table rowIndex:(NSInteger)rowIndex;
上一步中的代碼示例已經給出了WKInterfaceTable使用方式,具體代碼請看demo。
五、每一個單獨的頁面都寫好了,如今要讓他們動起來。
WatchKit提供了三類頁面導航方式。
第一種UINavigationController
控制的相似棧的導航方式,相應接口
- (void)pushControllerWithName:(NSString *)name context:(id)context; // context passed to child controller via initWithContext: - (void)popController; - (void)popToRootController;
第二種 modal 形式,相應接口
- (void)presentControllerWithName:(NSString *)name context:(id)context; // modal presentation - (void)dismissController;
第三種 相似 UIPageController
的分頁式導航,相應接口
- (void)presentControllerWithNames:(NSArray *)names contexts:(NSArray *)contexts; // modal presentation of paged controllers. contexts matched to controllers - (void)becomeCurrentPage;
其中的「WithName(s):」參數就是每一個控件在storyboard中設置的Identifier屬性。
好了,就先寫這麼多吧,後期有時間會繼續補充。