環信SDK與Apple Watch的結合(3)

第3章主要介紹怎樣在Watch App的頁面上顯示iPhone程序裏的數據。主要操做的是「EMWatchOCDemo WatchKit Extension」這個文件夾,附源碼EMWatchOCDemogit

若是你已經看過我在第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顯示數據了。

顯示數據主要用到了WKInterfaceTableWKInterfaceTable相對於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
WKInterfaceTable.h
- (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;
WKInterfaceController中

上一步中的代碼示例已經給出了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屬性。

好了,就先寫這麼多吧,後期有時間會繼續補充。

相關文章
相關標籤/搜索