*[doc] update documentation about custom component and module
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex-site/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex-site/commit/926bef07 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex-site/tree/926bef07 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex-site/diff/926bef07 Branch: refs/heads/master Commit: 926bef07d46bfd9dc95eded5fdb7120304c2aed2 Parents: cb0422b Author: acton393 <[email protected]> Authored: Tue Mar 13 21:18:10 2018 +0800 Committer: acton393 <[email protected]> Committed: Tue Mar 13 21:18:10 2018 +0800 ---------------------------------------------------------------------- source/cn/guide/extend-ios.md | 432 +++++++++++----------- source/cn/guide/extend-js-framework.md | 2 +- source/cn/guide/extend-module-using-swift.md | 115 ++++++ source/cn/wiki/component-introduction.md | 21 +- source/cn/wiki/module-introduction.md | 3 +- 5 files changed, 346 insertions(+), 227 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/926bef07/source/cn/guide/extend-ios.md ---------------------------------------------------------------------- diff --git a/source/cn/guide/extend-ios.md b/source/cn/guide/extend-ios.md index 3b9ba70..bfb1270 100644 --- a/source/cn/guide/extend-ios.md +++ b/source/cn/guide/extend-ios.md @@ -6,215 +6,198 @@ order: 6.3 version: 2.1 --- -## 注æ - +>>> 注æ **Weex æææ´é²ç» JS çå ç½® module æ component API 齿¯å®å ¨å坿§çï¼ å®ä»¬ä¸ä¼å»è®¿é®ç³»ç»çç§æ API ï¼ä¹ä¸ä¼å»åä»»ä½ runtime ä¸ç hack æ´ä¸ä¼å»æ¹ååºç¨åæçåè½å®ä½ã** **妿éè¦æ©å±èªå®ä¹ç module æè component ï¼ä¸å®æ³¨æä¸è¦å° OC ç runtime æ´é²ç» JS ï¼ ä¸è¦å°ä¸äºè¯¸å¦ `dlopen()`ï¼ `dlsym()`ï¼ `respondsToSelector:`ï¼`performSelector:`ï¼`method_exchangeImplementations()` ç卿åä¸å¯æ§çæ¹æ³æ´é²ç»JSï¼ ä¹ä¸è¦å°ç³»ç»çç§æAPIæ´é²ç»JS** -## Module æ©å± +Weex SDK åªæä¾æ¸²æï¼æä¾äºä¸äºé»è®¤çç»ä»¶åè½åï¼å¦æä½ éè¦ä¸äºç¹æ§ä½ Weex å¹¶æªæä¾ï¼å¯ä»¥éè¿æ©å±èªå®ä¹çä¸äºæä»¶æ¥å®ç°ï¼éè¿ WeexSDK å è½½ãè¿äºæä»¶å æ¬ [component](../wiki/component-introduction.html), [module](../wiki/module-introduction.html) å [handler](../wiki/handler-introduction.html)ã +>>> æ¬æé½ä»¥ Objective-C 为ä¾å书åï¼å¦æéè¦ swift 请åè -[swift](https://github.com/weexteam/article/issues/55) æ©å± module +## èªå®ä¹ module -Weex SDK åªæä¾æ¸²æï¼è䏿¯å ¶ä»çè½åï¼å¦æä½ éè¦ åç½ç»ï¼å¾çï¼URL跳转è¿äºç¹æ§ï¼éè¦èªå·±å¨æå®ç°ä»ä»¬ -ä¾å¦ï¼å¦æä½ æ³å®ç°ä¸ä¸ªurlå°åè·³è½¬å½æ°ï¼ä½ å¯ä»¥æç §å¦ä¸æ¥éª¤å®ç°ä¸ä¸ª Module +èªå®ä¹ module, éè¦è®©èªå·±ç class éµå¾ª `WXModuleProtocol` è¿ä¸ªprotocol, éè¿ `WX_EXPORT_METHOD` è¿ä¸ªå®æ´é²åºéè¦éåºå° `JavaScript` è°ç¨çæ¹æ³ï¼æ³¨å module , å°±å¯ä»¥å®æä¸ä¸ªç®å module çèªå®ä¹ã -### **èªå®ä¹moduleçæ¥éª¤** -1. èªå®ä¹çmoduleç±» å¿ é¡»å®ç° `WXModuleProtocol` -2. å¿ é¡»æ·»å å®`WX_EXPORT_METHOD`, å®å¯ä»¥è¢«weexè¯å«ï¼å®çåæ°æ¯ JavaScriptè°ç¨ moduleæå®æ¹æ³çåæ° -3. æ·»å `@synthesized weexInstance`ï¼æ¯ä¸ªmoudle对象被ç»å®å°ä¸ä¸ªæå®çå®ä¾ä¸ -4. Module æ¹æ³ä¼å¨UI线ç¨ä¸è¢«è°ç¨ï¼æä»¥ä¸è¦å太å¤èæ¶çä»»å¡å¨è¿éï¼å¦æè¦å¨å ¶ä»çº¿ç¨æ§è¡æ´ä¸ªmodule æ¹æ³ï¼éè¦å®ç°`WXModuleProtocol`ä¸`- (NSThread *)targetExecuteThread`çæ¹æ³ï¼è¿æ ·ï¼ååå°è¿ä¸ªmoduleçä»»å¡ä¼å¨æå®ç线ç¨ä¸è¿è¡ -5. Weex çåæ°å¯ä»¥æ¯ String æè Map -6. Module æ¯æè¿åå¼ç» JavaScriptä¸çåè°ï¼åè°çç±»åæ¯`WXModuleCallback`,åè°çåæ°å¯ä»¥æ¯Stringæè Map +- module èªå®ä¹åé¶ - ```object-c - @implementation WXEventModule + ä¸é¢å®æä¸ä¸ª `module`, 该 `module` æ´é²ä¸ä¸ªæå°è¾å ¥åæ°çæ¹æ³ - @synthesize weexInstance; - WX_EXPORT_METHOD(@selector(openURL:callback:)) + 1. æ°å»ºä¸ä¸ª åºç±»ä¸º NSObject ç class `WXCustomEventModule`, 让该类éµå¾ª `WXModuleProtocol` çåè®® +  - - (void)openURL:(NSString *)url callback:(WXModuleCallback)callback - { - NSString *newURL = url; - if ([url hasPrefix:@"//"]) { - newURL = [NSString stringWithFormat:@"http:%@", url]; - } else if (![url hasPrefix:@"http"]) { - newURL = [NSURL URLWithString:url relativeToURL:weexInstance.scriptURL].absoluteString; - } + 2. æ·»å æå°çæ¹æ³ï¼éè¿ `WX_EXPORT_METHOD` æ´é²è¯¥æ¹æ³ +  - UIViewController *controller = [[WXDemoViewController alloc] init]; - ((WXDemoViewController *)controller).url = [NSURL URLWithString:newURL]; + 3. å¨åå§å宿 Weex SDK ä¹å注å该 module +  - [[weexInstance.viewController navigationController] pushViewController:controller animated:YES]; - callback(@{@"result":@"success"}); - } + å°æ¤ï¼æä»¬å·²ç»å®æäºä¸ä¸ªç®åç module æ¹æ³çå°è£ ï¼javaScript 端ç使ç¨å¦ä¸: - @end + ```javaScript + weex.requireModule("event").showParams("hello Weex) ``` -#### æ´é²åæ¥æ¹æ³<span class="api-version">v0.10+</span> - -å¦æä½ æ³è¦æ´é²åæ¥çnativeæ¹æ³ç»JSï¼ å³JSå¯ä»¥ç´æ¥æ¿å°Nativeçè¿åå¼ã ä½ å¯ä»¥ä½¿ç¨`WX_EXPORT_METHOD_SYNC` å®ã - -native 代ç : - -```objective-c -@implementation WXEventModule - -WX_EXPORT_METHOD_SYNC(@selector(getString)) - -- (NSString *)getString -{ - return @"testString"; -} - -@end -``` - -js 代ç : - -```javascript -const eventModule = weex.requireModule('event') -const returnString = syncTest.getString() // return "testString" -``` - -é¤äºstring, ä½ ä¹å¯ä»¥è¿å `number/array/dictionary` ç±»å. - -`注æ:` æ´é²çåæ¥æ¹æ³åªè½å¨ JS çº¿ç¨æ§è¡ï¼è¯·ä¸è¦å太å¤åæ¥çå·¥ä½å¯¼è´JSæ§è¡é»å¡ã - -`注æ:` Vue 2.0 è¿æªæ¯æè¿ä¸ªç¹æ§ï¼ææ©ä¼å¨ 0.12 çæ¬æ¯æ - - - -### 注å module - -éè¿è°ç¨ WXSDKEngine ä¸ç `registerModule:withClass`æ¹æ³æ¥æ³¨åèªå·±çmodule - -```object-c -WXSDKEngine.h -/** -* @abstract Registers a module for a given name -* @param name The module name to register -* @param clazz The module class to register -**/ -+ (void)registerModule:(NSString *)name withClass:(Class)clazz; -[WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]]; -``` - -### 使ç¨èªå·±ç module - -è¿éç require éé¢ç event å°±æ¯å¨ ä¸ä¸æ¥è°ç¨ `registerModule:` 注å module æ¶åç name - -```javascript -var eventModule = weex.requireModule('event'); -eventModule.openURL('url',function(ret) { - nativeLog(ret); -}); +- module é«é¶ç¨æ³ + 1. `weexInstance` + å¨ä¸ä¸ª Weex 页é¢ä¸ï¼é»è®¤ WXSDKInstance ç Object ææ å¤ä¸ª module ç Object, è module ç object æ¯æ²¡æå¯¹ WXSDKInstance åææçï¼ å¨èªå®ä¹çmodule 䏿·»å `@synthesize weexInstance`, module Object å¯ä»¥å¯¹ ææå®æ¬èº«ç WXSDKInstance Object åä¸ä¸ª å¼±å¼ç¨ï¼ éè¿ weexInstance å¯ä»¥æ¿å°è°ç¨è¯¥ module ç页é¢çä¸äºä¿¡æ¯ã + 2. `targetExecuteThread` + Module æ¹æ³é»è®¤ä¼å¨UI线ç¨ä¸è¢«è°ç¨ï¼å»ºè®®ä¸è¦å¨è¿å太å¤èæ¶çä»»å¡ï¼å¦æè¦å¨å ¶ä»çº¿ç¨æ§è¡æ´ä¸ªmodule æ¹æ³ï¼éè¦å®ç°`WXModuleProtocol`ä¸`- (NSThread *)`çæ¹æ³ï¼è¿æ ·ï¼ååå°è¿ä¸ªmoduleçä»»å¡ä¼å¨æå®ç线ç¨ä¸è¿è¡ + + 3. `WXModuleKeepAliveCallback` + Module æ¯æè¿åå¼ç» JavaScriptä¸çåè°ï¼åè°çç±»åæ¯`WXModuleKeepAliveCallback`,åè°çåæ°å¯ä»¥æ¯Stringæè Map, 该 block 第ä¸ä¸ªåæ°ä¸ºåè°ç» JavaScript çæ°æ®ï¼ç¬¬äºåæ°æ¯ä¸ä¸ª BOOL å¼ï¼è¡¨ç¤ºè¯¥åè°æ§è¡å®æä¹åæ¯å¦è¦è¢«æ¸ é¤ï¼JavaScript æ¯æ¬¡è°ç¨é½ä¼äº§çä¸ä¸ªåè°ï¼ä½æ¯å¯¹äºåç¬ä¸æ¬¡è°ç¨ï¼æ¯å¦è¦å¨å®æè¯¥è°ç¨ä¹åæ¸ é¤æåè°å½æ° id å°±ç±è¿ä¸ªé项æ§å¶ï¼å¦éç¹æ®åºæ¯ï¼å»ºè®®ä¼ NOã + 4. `WX_EXPORT_METHOD_SYNC` + >>> WeexSDK 0.10 çæ¬åææ¯æï¼æ´é²çåæ¥æ¹æ³åªè½å¨ JS çº¿ç¨æ§è¡ï¼è¯·ä¸è¦å太å¤åæ¥çå·¥ä½å¯¼è´JSæ§è¡é»å¡ã + + ä½¿ç¨ `WX_EXPORT_METHOD` æ´é²å°åç«¯çæ¹æ³é½æ¯å¼æ¥æ¹æ³(è·å¾ç»æéè¦éè¿åè°å½æ°è·å¾), 妿ææè·å¾åæ¥è°ç¨ç»æï¼å¯ä»¥ä½¿ç¨`WX_EXPORT_METHOD_SYNC` æ´é²module æ¹æ³ã + +## Component æ©å± + +å¯è½ WeexSDK å ç½®æä¾çç»ä»¶å¹¶ä¸è½æ»¡è¶³ä½ çå¼åéæ±ï¼æ¯å¦éè¦ææä½¿ç¨å°å¾è¿æ ·ä¸ä¸ªå¤æçç»ä»¶ï¼å¯ä»¥éè¿èªå®ä¹ä¸ä¸ªç»ä»¶ï¼æ³¨åå° WeexSDK engine ä¸ï¼ å¯ä»¥å¾æ¹ä¾¿ç使ç¨èµ·æ¥ã + +### component åºç¡çå½å¨æ + +- æ°å»ºä¸ä¸ªåºç±»ä¸º `WXComponent` ç class + å¦ææ¤æ¶æä»¬ä»ä¹é½ä¸åï¼å°æ¹ç»ä»¶æ³¨åè¿ WeexSDK engineï¼å®çåè½å°±è·å ç½®ç `div` ç»ä»¶åè½æ¯ä¸è´çã + +- è¦ç `WXComponent` ä¸ççå½å¨ææ¹æ³ + + - `loadView` + ä¸ä¸ª component é»è®¤å¯¹åºäºä¸ä¸ª view ï¼ å¦ææªè¦ç `loadView` æä¾èªå®ä¹ `view`, ä¼ä½¿ç¨ `WXComponent` åºç±»ä¸ç `WXView`, `WXView` æ¯ç»§æ¿èª UIView çä¸ä¸ªæ´¾ç viewã + è¦å®ç°å°å¾åè½ï¼æä»¬éè¦å¯¹åºçå°å¾ view, æ¯å¦ç³»ç»ç `MKMapView` + + ``` + - (UIView *)loadView { + return [MKMapView new]; + } + ``` + + - `viewDidLoad` + 对ç»ä»¶ view éè¦åä¸äºé ç½®ï¼æ¯å¦è®¾ç½® delegate, å¯ä»¥å¨ `viewDidLoad` çå½å¨æåï¼å¦æå½å view æ²¡ææ·»å subview çè¯ï¼ä¸è¦è®¾ç½® view ç frameï¼WeexSDK 伿 ¹æ® style 设置ã + + ``` + - (void)viewDidLoad { + ((MKMapView*)self.view).delegate = self; + } + ``` +- 注å component + + ``` + [WXSDKEngine registerComponent:@"map" withClass:[WXMapComponent class]]; + ``` + å¨å端页é¢ç´æ¥å¯ä»¥ä½¿ç¨ `map` æ ç¾ï¼å¦ä¸æç¤º + ``` - -Weex SDK 没æ å¾çä¸è½½ï¼navigation æä½çè½åï¼è¯·å¤§å®¶èªå·±å®ç°è¿äº protocol - -## WXImgLoaderProtocol - -weexSDK 没æå¾çä¸è½½çè½åï¼éè¦å®ç° WXImgLoaderProtocol, åèä¸é¢çä¾å - -```object-c -WXImageLoaderProtocol.h -@protocol WXImgLoaderProtocol <WXModuleProtocol> -/** -* @abstract Creates a image download handler with a given URL -* @param imageUrl The URL of the image to download -* @param imageFrame The frame of the image you want to set -* @param options : The options to be used for this download -* @param completedBlock : A block called once the download is completed. - image : the image which has been download to local. - error : the error which has happened in download. - finished : a Boolean value indicating whether download action has finished. -*/ --(id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)options completed:(void(^)(UIImage *image, NSError *error, BOOL finished))completedBlock; -@end + <template> + <div> + <map style="width:200px;height:200px"></map> + </div> + </template> ``` -å®ç°ä¸è¿°åè®® - -```object-c -@implementation WXImgLoaderDefaultImpl -#pragma mark - -#pragma mark WXImgLoaderProtocol +- æ¯æèªå®ä¹äºä»¶ -- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)userInfo completed:(void(^)(UIImage *image, NSError *error, BOOL finished))completedBlock -{ - if ([url hasPrefix:@"//"]) { - url = [@"http:" stringByAppendingString:url]; - } - return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:url] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { - } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, finished); + ç» map ç»ä»¶æ¯æ `mapLoaded` äºä»¶ + ``` + <template> + <div> + <map style="width:200px;height:200px" @mapLoaded="onMapLoaded"></map> + </div> + </template> + + <script> + export default { + methods: { + onMapLoaded:function(e) { + console.log("map loaded"+JSON.stringify(e)) + } + } } - }]; -} -@end -``` - -### handler注å - -ä½ å¯ä»¥éè¿WXSDKEngine ä¸ç `registerHandler:withProtocol`注åhandler - -```object-c -WXSDKEngine.h -/** -* @abstract Registers a handler for a given handler instance and specific protocol -* @param handler The handler instance to register -* @param protocol The protocol to confirm -*/ -+ (void)registerHandler:(id)handler withProtocol:(Protocol *)protocol; - -[WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)] -``` + </script> + ``` + ç»å½åç»ä»¶æ·»å `BOOL` æå mapLoaded,è®°å½å½åäºä»¶æ¯å¦è¢«æ·»å + + - è¦çç»ä»¶çå½å¨ææ¹æ³æ·»å åç§»é¤äºä»¶ + + è¦ç `addEvent` å `removeEvent` æ¹æ³ -## Components æ©å± + ``` + - (void)addEvent:(NSString *)eventName { + if ([eventName isEqualToString:@"mapLoaded"]) { + _mapLoaded = YES; + } + } -è½ç¶ WeexSDK 䏿å¾å¤ç native ç Componentï¼ä½è¿æå¯è½å¹¶ä¸è½æ»¡è¶³ä½ çéæ±ãå¨ä¹åä½ å¯è½å·²ç»åäºä¸äºå¾é ·ç« native çç»ä»¶ï¼æ³å è£ ä¸ä¸ï¼å¯¼å ¥å° Weex ä¸ï¼å æ¤æä»¬æä¾äºè®©å¼åè å®ç°èªå·±ç native Componentãä¸é¢å°ä»¥ WeexSDK ä¸å·²ç»åå¨ç Componentï¼`image` 为ä¾åï¼ä»ç»ä¸ä¸å¦ä½æå»ºä¸ä¸ª native Componentãåè®¾ä½ å·²ç»äºè§£ iOS å¼å + - (void)removeEvent:(NSString *)eventName + { + if ([eventName isEqualToString:@"mapLoaded"]) { + _mapLoaded = NO; + } + } + ``` + - å¨éå®çæ¶é´åäºä»¶éç¥ -### 注å Component + å¨ MKMapView å è½½å®æç delegate æ¹æ³ä¸ï¼åäºä»¶éç¥èªå®ä¹äºä»¶ -注åä¸ä¸ª component æ¯è¾ç®åï¼è°ç¨ `WXSDKEngine` ä¸ç `registerComponent:withClass:` æ¹æ³ï¼ä¼ å ¥ç»ä»¶çæ ç¾åç§°ï¼è¿æå¯¹åºç class ç¶åä½ å¯ä»¥å建ä¸ä¸ª `WXImageComponent` 表示 `image` ç»ä»¶çå®ç°ãå¨ `.we` æä»¶ä¸ï¼åªéè¦å `<image></image>` + ``` + - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView { + if (_mapLoaded) { + [self fireEvent:@"mapLoaded" params:@{@"customKey":@"customValue"} domChanges:nil] + } + } + ``` -### æ·»å 屿§ -ç°å¨æä»¬è¦åä¸äºè®© image component æ´å 强大çäºæ ãæ¢ç¶ä½ä¸ºä¸ä¸ªå¾çç componentï¼é£å®åºè¯¥è¦ææºï¼ç»ä»å ä¸ä¸ä¸ª `src` ç屿§ï¼åæ¶ç»å®å ä¸ä¸ä¸ª `resize` ç屿§ï¼å¯ä»¥é ç½®çæ `contain/cover/stretch`ï¼ -```object-c -@interface WXImageComponent () +- æ¯æèªå®ä¹å±æ§ -@property (nonatomic, strong) NSString *imageSrc; -@property (nonatomic, assign) UIViewContentMode resizeMode; + æ·»å èªå®ä¹å±æ§ showTraffic -@end -``` + ``` + <template> + <div> + <map style="width:200px;height:200px" showTraffic="true"></map> + </div> + </template> + ``` + - è¦çç»ä»¶åå§åæ¹æ³ `initWithRef...` -component 䏿æç styleï¼attributeï¼events é½ä¼è¢«ä¼ éå° Component çåå§åæ¹æ³ä¸ï¼æä»¥ï¼ä½ å¯ä»¥å¨åå§åæ¹æ³ä¸åå¨ä½ æå ´è¶£çä¸äºå±æ§å¼ + å½åcomponent æ·»å `BOOL` æå showsTrafficï¼æ¥åä¿åç¨æ·è¾å ¥å¼ï¼æ·»å å°å½åç»ä»¶ä¸çææå±æ§é½ä¼å¨åå§åæ¹æ³ä¸ `attributes` ä¸ä¼ è¿æ¥ï¼æ¤å¤æä»¬å¤çæä»¬æå ´è¶£ç屿§å³å¯ã -```object-c -@implementation WXImageComponent + ``` + - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance { + if(self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) { + + if (attributes[@"showsTraffic"]) { + _showsTraffic = [WXConvert BOOL: attributes[@"showsTraffic"]]; + } + } + return self; + } + ``` -- (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance -{ - if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) { - _imageSrc = [WXConvert NSString:attributes[@"src"]]; - _resizeMode = [WXConvert UIViewContentMode:attributes[@"resize"]]; -} + - å¨ `viewDidLoad` ä¸è®¾ç½®è¯¥å±æ§ + + ``` + - (void)viewDidLoad { + ((MKMapView*)self.view).showsTraffic = _showsTraffic; + } + ``` - return self; -} + - æ¯æå±æ§æ´æ° + + ``` + - (void)updateAttributes:(NSDictionary *)attributes + { + if (attributes[@"showsTraffic"]) { + _showsTraffic = [WXConvert BOOL: attributes[@"showsTraffic"]]; + ((MKMapView*)self.view).showsTraffic = _showsTraffic; + } + } -@end -``` + ``` -attribute 䏿¿å°çå¼çç±»å齿¯ `id`ï¼æä»¬å¯ä»¥ç¨è½¬æ¢æ¹æ³æå®è½¬æ¢å°ä»»ä½å¼ãWeex SDK æä¾äºä¸äºåºç¡çè½¬æ¢æ¹æ³ï¼å¯ä»¥åè `WXConvert` ç±»ï¼æè ä½ å¯ä»¥æ·»å èªå·±ç转æ¢å½æ°ã -### Hooking 渲æçå½å¨æ +### æ´å¤ component çå½å¨æ native ç component æ¯ç± Weex 管ççï¼Weex å建ï¼å¸å±ï¼æ¸²æï¼éæ¯ãWeex ç component çå½å¨æé½æ¯å¯ä»¥ hook çï¼ä½ å¯ä»¥å¨è¿äºçå½å¨æä¸å»åèªå·±çäºæ ã @@ -232,59 +215,11 @@ native ç component æ¯ç± Weex 管ççï¼Weex å建ï¼å¸å±ï¼æ¸²æï¼é | addEvent: | ç»componentæ·»å eventçæ¶åè°ç¨. | | removeEvent: | å¨eventç§»é¤çæ¶åè°ç¨. | -å¨ image component çä¾åéé¢ï¼å¦ææä»¬éè¦æä»¬èªå·±ç image view çè¯ï¼å¯ä»¥å¤å `loadView`è¿ä¸ªæ¹æ³. - -```object-c -- (UIView *)loadView -{ -return [[WXImageView alloc] init]; -} -``` - -ç°å¨æä»¬ä½¿ç¨ `WXImageView` 渲æ `image` componentã -ä½ä¸ºä¸ä¸ª image componentï¼æä»¬éè¦æ¿å°æå¡å¨å¾çï¼è䏿å®è®¾ç½®è¿ image view é. è¿ä¸ªæä½å¯ä»¥å¨ `viewDidLoad` æ¹æ³ä¸åï¼è¿ä¸ªæ¹æ³æ¯å¨ view å·²ç»è¢«å建èä¸å è½½äºæ¶å Weex SDK ä¼è°ç¨å°ï¼èä¸ `viewDidLoad` è¿ä¸ªæ¹æ³æ¯ä½ åé¢å¤åå§å工使¯å¦æ¹å content mode(ä¹å°±æ¯è®¾ç½®resize) çæå¥½æ¶é´. - -```object-c -- (void)viewDidLoad -{ - UIImageView *imageView = (UIImageView *)self.view; - imageView.contentMode = _resizeMode; - imageView.userInteractionEnabled = YES; - imageView.clipsToBounds = YES; - imageView.exclusiveTouch = YES; - - // Do your image fetching and updating logic -} -``` - -妿å¯ä»¥æ¹å image ç srcï¼ä¹å¯ä»¥ hook `updateAttributes:` æ¹æ³æ¥å屿§æ´æ°æä½ï¼å½ `updateAttributes:` æè `updateStyles:` 被è°ç¨çæ¶åï¼ component ç view å·²ç»å è½½å®æ - -```object-c -- (void)updateAttributes:(NSDictionary *)attributes -{ - if (attributes[@"src"]) { - _imageSrc = [WXConvert NSString:attributes[@"src"]]; - // Do your image updating logic - } - - if (attributes[@"resize"]) { - _resizeMode = [WXConvert UIViewContentMode:attributes[@"resize"]]; - self.view.contentMode = _resizeMode; - } -} -``` - æè®¸ä½ éè¦èèæ´å¤ççå½å¨ææ¹æ³å» Hookï¼å½å¸å±å®ææ¶åï¼å `layoutDidFinish`ï¼å¦æä½ æ³äºè§£æ´å¤ï¼å¯ä»¥åèä¸ä¸`WXComponent.h` 声æçæ¹æ³ã -ç°å¨ä½ å¯ä»¥ç¨å¨ä»»ä½ `.we` æä»¶éé¢ä½¿ç¨ `<image>`ï¼èä¸å¯ä»¥å ä¸ image ç屿§ã - -```html -<image style="your-custom-style" src="image-remote-source" resize="contain/cover/stretch"></image> -``` - -##### component æ¹æ³ +### component æ¹æ³ -WeexSDK 0.9.5 ä¹åæ¯æäºå¨ js ä¸ç´æ¥è°ç¨ component çæ¹æ³ï¼è¿éæä¾ä¸ä¸ªä¾å +WeexSDK 0.9.5 ä¹åæ¯æäºå¨ js ä¸ç´æ¥è°ç¨ component çæ¹æ³ï¼èªå®ä¹å®ç»ä»¶åï¼ä¸é¢çä¾åå¯ä»¥æå¼ä½ 宿 component æ¹æ³ã - èªå®ä¹ä¸ä¸ª WXMyCompoenent çç»ä»¶ @@ -324,3 +259,54 @@ WeexSDK 0.9.5 ä¹åæ¯æäºå¨ js ä¸ç´æ¥è°ç¨ component çæ¹æ³ï¼è¿é } </script> ``` + +## èªå®ä¹ handler + + weexSDK ç®å没ææä¾å¾çä¸è½½çè½åï¼å¨`WXImgLoaderProtocol` å®ä¹äºä¸äºè·åå¾ççæ¥å£, image ç»ä»¶æ£æ¯éè¿ `WXImgLoaderProtocol` è·å¾å¹¶å±ç¤ºå¾çï¼å¼åè å¯ä»¥å®ç°è¯¥ protocol ä¸çæ¥å£æ¹æ³ï¼è¿æ · `image` æ ç¾æè½æ£å¸¸å±ç¤ºå¾çã + + å¼åè ä¹å¯ä»¥å®ä¹èªå·±ç `protocol` å对åºçå®ç°æ¥ä½¿ç¨ `handler` æºå¶ + +- æ°å»ºåºç±»ä¸º NSObject ç class å®ç° `WXImgLoaderProtocol` åè®®ï¼ å®ç° `WXImgLoaderProtocol` çæ¹æ³ + + ```object-c + @implementation WXImgLoaderDefaultImpl + - (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)userInfo completed:(void(^)(UIImage *image, NSError *error, BOOL finished))completedBlock + { + if ([url hasPrefix:@"//"]) { + url = [@"http:" stringByAppendingString:url]; + } + return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:url] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { + } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, finished); + } + }]; + } + @end + ``` + +- 注å handler + + ä½ å¯ä»¥éè¿WXSDKEngine ä¸ç `registerHandler:withProtocol` 注åhandler + + ```object-c + WXSDKEngine.h + /** + * @abstract Registers a handler for a given handler instance and specific protocol + * @param handler The handler instance to register + * @param protocol The protocol to confirm + */ + + (void)registerHandler:(id)handler withProtocol:(Protocol *)protocol; + + [WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)] + + ``` +- ä½¿ç¨ handler + + handler å¯ä»¥å¨ native ç module æè component å®ç°ä¸ä½¿ç¨ + + ```objective-c + id<WXImgLoaderProtocol> imageLoader = [WXSDKEngine handlerForProtocol:@protocol(WXImgLoaderProtocol)]; + [iamgeLoader downloadImageWithURL:imageURl imageFrame:frame userInfo:customParam completed:^(UIImage *image, NSError *error, BOOL finished){ + }]; + ``` http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/926bef07/source/cn/guide/extend-js-framework.md ---------------------------------------------------------------------- diff --git a/source/cn/guide/extend-js-framework.md b/source/cn/guide/extend-js-framework.md index 1e9db01..fbdb86e 100644 --- a/source/cn/guide/extend-js-framework.md +++ b/source/cn/guide/extend-js-framework.md @@ -2,7 +2,7 @@ title: æå± JS framework type: guide group: æ©å± -order: 6.4 +order: 6.5 version: 2.1 --- http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/926bef07/source/cn/guide/extend-module-using-swift.md ---------------------------------------------------------------------- diff --git a/source/cn/guide/extend-module-using-swift.md b/source/cn/guide/extend-module-using-swift.md new file mode 100644 index 0000000..3098284 --- /dev/null +++ b/source/cn/guide/extend-module-using-swift.md @@ -0,0 +1,115 @@ +--- +title: iOS æ©å± +type: guide +group: æ©å± +order: 6.4 +version: 2.1 +--- + +## Swift In Weex + +[SwiftåObjective-C](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID122) æ··ç¼ + +åè宿´ [ä¾å](https://github.com/acton393/WeexSwiftSample.git) + +### ä½¿ç¨ Swift è¿è¡ module æ©å± + +å 为 module æ´é² method æ¯éè¿`Objective-C`宿¥åçï¼è°ç¨çæ¶åæ¯éè¿åå°ï¼æä»¥Swiftæ©å± module éè¿`extension` `Objective-C`çç±»ã +- æ°å»º `WXSwiftTestModule.h/m` å `WXSwiftTestModule.swift`æä»¶ï¼ 卿°å»ºSwiftæä»¶çæ¶åä¼æç¤º +  + éæ© `Create Bridging Header`, å 为æä»¬è¦å¨ Swift ä¸è®¿é® `Objective-C` çä¸äºç±»ï¼æ£æ¯éè¿è¿ä¸ª headeræ´é² OC çç±»ç» Swift,header æ ¼å¼ä¸º `yourTarget-Bridging-Header.h`ï¼æè¿éå建å®headeræä»¶å称为ï¼`WeexDemo-Bridging-Header.h` +- `WXSwiftTestModule.h/m`ä¸å®ç° + - WXSwiftTestModule.h ä¸ + + ``` + #import <Foundation/Foundation.h> + #import <WeexSDK/WeexSDK.h> + + @interface WXSwiftTestModule : NSObject <WXModuleProtocol> + + @end + + ``` + - WXSwiftTestModule.m ä¸ + + WeexDemo-Swift.h è¿ä¸ªæä»¶éè¦ç¼è¯ä¸ä¸æå¯ä»¥æç´¢å°ï¼å ·ä½çè·¯å¾ + + ``` + weex/ios/playground/DerivedData/WeexDemo/Build/Intermediates/WeexDemo.build/Debug-iphonesimulator/WeexDemo.build/DerivedSources/WeexDemo-Swift.h + ``` + + è·¯å¾å ·ä½éè¦æ ¹æ®èªå·±å·¥ç¨èå® + + ``` + #import "WXSwiftTestModule.h" + #import "WeexDemo-Swift.h" // Swiftç±»åæ¹æ³ è¢« `Objective-C` è¯å«éè¦å¯¼å ¥ + + @implementation WXSwiftTestModule + #pragma clang diagnostic push //å ³éunknow selectorçwarrning + #pragma clang diagnostic ignored "-Wundeclared-selector" + + WX_EXPORT_METHOD(@selector(printSome:callback:)) //Swift ä¸å®ä¹çæ¹æ³ï¼XCode è½¬æ¢æçæç»çæ¹æ³åç§°ï¼å¨`WeexDemo-Swift.h`é颿¥ç + + #pragma clang diagnostic pop + + @end + + ``` +- Swift ä¸å®ç° + æ©å± OC çç±» `WXSwiftTestModule`,å¢å äºä¸ä¸ªæ¹æ³ï¼è¿ä¸ªæ¹æ³å°±æ¯æä»¬è¦æ´é²åºæ¥ï¼å¨ js ä¸å¯ä»¥è°å°ç + - WXSwiftTestModule.swift + + ``` + import Foundation + public extension WXSwiftTestModule { + public func printSome(someThing:String, callback:WXModuleCallback) { + print(someThing) + callback(someThing) + } + } + ``` + + `WXSwiftTestModule` å`WXModuleCallback` å ä¸ºæ¯ OC çï¼éè¦å¨ `WeexDemo-Bridging-Header` 䏿´é² + - WeexDemo-Bridging-Header.hä¸ + + ``` + // + // Use this file to import your target's public headers that you would like to expose to Swift. + // + #import "WXSwiftTestModule.h" + #import "WeexSDK.h" + ``` + + è³æ¤è¿ä¸ªä½¿ç¨ Swift å¼åçç®åç module å·²ç»å®æ + + ### module ä½¿ç¨ + - 注å module + + ``` + [WXSDKEngine registerModule:@"swifter" withClass:[WXSwiftTestModule class]]; + + ``` + - we æä»¶ä¸ä½¿ç¨ + + ``` + <template> + <text>Swift Module</text> + </template> + + <script> + require('weex-components'); + + module.exports = { + data: { + + }, + ready: function() { + var swifter = require('@weex-module/swifter'); + swifter.printSome("https://www.taobao.com",function(param){ + nativeLog(param); + }); + } + + }; + </script> + ``` http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/926bef07/source/cn/wiki/component-introduction.md ---------------------------------------------------------------------- diff --git a/source/cn/wiki/component-introduction.md b/source/cn/wiki/component-introduction.md index 33c6f32..a7e1d53 100644 --- a/source/cn/wiki/component-introduction.md +++ b/source/cn/wiki/component-introduction.md @@ -7,5 +7,22 @@ version: 2.1 --- ### ä»ä¹æ¯ component - ç®åæ¥è®²ï¼`component` 就类似 `Weex` 渲æå¼æä¸ç `Widget`, 符åä¸å®çè§åç `Widget`, å¯ä»¥è¢« Weex engine å¨åå§åçæ¶åæ£ç¡®çå è½½ï¼å¼åè å¨ `DSL` 书å对åºçæ ç¾åå(卿³¨åçæ¶æä¾ç注ååå)ï¼ æ¯å¦å ç½®çä¸äºç»ä»¶ `div`ï¼`image` å `text`ãå®å¯ä»¥è¯»åç¹å®ç屿§ï¼å±ç¤ºç¨æ·æ°æ®ï¼æ¿è½½å触åäºä»¶ã - \ No newline at end of file + ç®åæ¥è®²ï¼`component` 就类似 `Weex` 渲æå¼æä¸ç `Widget`, 符åä¸å®çè§åç `Widget`, å¯ä»¥è¢« Weex engine å¨åå§åçæ¶åæ£ç¡®çå è½½ï¼å¼åè å¨ `DSL` 书å对åºçæ ç¾åå(卿³¨åçæ¶æä¾ç注ååå)ï¼ æ¯å¦å ç½®çä¸äºç»ä»¶ `div`ï¼`image` å `text`ãå®å¯ä»¥è¯»åç¹å®ç屿§ï¼å±ç¤ºç¨æ·æ°æ®ï¼æ¿è½½å触åäºä»¶ï¼å¦æ Weex å ç½®çç»ä»¶ä¸è½æ»¡è¶³ä½ çå¼åéæ±ï¼å¯ä»¥èªå®ä¹ä½ èªå·±ç componentã + + +### component æ¹æ³ + + component æ¹æ³æ¯ç»ä»¶æ¯æçæ¹æ³ï¼JavaScript å¯ä»¥ç´æ¥å¯¹å¯¹åºæ ç¾å£°æ `ref` 屿§ä¹åï¼ç´æ¥å¯ä»¥è°ç¨å¯¹åºæ¹æ³çä¸ä¸ªç¹æ§ï¼ä¾å¦ä¸é¢ä¾åã + + ```html + <template> + <mycomponent ref='mycomponent'></mycomponent> + </template> + <script> + module.exports = { + created:function() { + this.$refs.mycomponent.focus(); + } + } + </script> + ``` http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/926bef07/source/cn/wiki/module-introduction.md ---------------------------------------------------------------------- diff --git a/source/cn/wiki/module-introduction.md b/source/cn/wiki/module-introduction.md index d3f6507..b6bfc5d 100644 --- a/source/cn/wiki/module-introduction.md +++ b/source/cn/wiki/module-introduction.md @@ -28,4 +28,5 @@ version: 2.1 ``` æ¥ç [stream](../references/modules/stream.html) 宿´ææ¡£ -## module å [handler](./handler-introduction.html) åºå« \ No newline at end of file +## module æ¹æ³ + require ä¹åç´æ¥å¯ä»¥è°ç¨ï¼ç¸å¯¹äº [component æ¹æ³](./component-introduction.html) å¯ä»¥ä¸ä¾èµç¹å®çç»ä»¶å®ä¾ã \ No newline at end of file
