想要運(yùn)用JSPatch這個(gè)框架慨丐,必須了解知曉的基礎(chǔ)F缕辍!房揭!
學(xué)習(xí)原文https://github.com/bang590/JSPatch/wiki/JSPatch-基礎(chǔ)用法#super
1备闲,require
在使用Objective-C類(lèi)之前需要調(diào)用require('className’),可以用逗號(hào)捅暴,分割恬砂,一次性導(dǎo)入多各類(lèi),或者直接在使用時(shí)才調(diào)用require('className’)
require('UIView')
var view = UIView.alloc().init()
require('UIView, UIColor')
require('UIView').alloc().init()
例:(1)var alertView =require('UIAlertView').alloc().initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles("Alert",self.dataSource()[indexPath.row()], self, "OK",? null);
alertView.show()
(2)cell = require('UITableViewCell').alloc().initWithStyle_reuseIdentifier(0, "cell")
2蓬痒,調(diào)用OC方法
調(diào)用類(lèi)方法:var redColor = UIColor.redColor();
調(diào)用實(shí)例方法:
var view = UIView.alloc().init();
view.setNeedsLayout();
參數(shù)傳遞,跟在OC一樣傳遞參數(shù):
var view = UIView.alloc().init();
var superView = UIView.alloc().init()
superView.addSubview(view)
Property
獲取/修改 Property 等于調(diào)用這個(gè) Property 的 getter / setter 方法泻骤,獲取時(shí)記得加 ():
view.setBackgroundColor(redColor);
var bgColor = view.backgroundColor();
方法名轉(zhuǎn)換,多參數(shù)方法名使用 _ 分隔:
var indexPath = require('NSIndexPath').indexPathForRow_inSection(0, 1);
若原 OC 方法名里包含下劃線(xiàn) _,在 JS 使用雙下劃線(xiàn) __ 代替:
// Obj-C: [JPObject _privateMethod];
JPObject.__privateMethod()
3,自己定義類(lèi)defineClass
API
defineClass(classDeclaration, [properties,] instanceMethods, classMethods)
@param classDeclaration: 字符串,類(lèi)名/父類(lèi)名和Protocol
@param properties: 新增property狱掂,字符串?dāng)?shù)組演痒,可省略
@param instanceMethods: 要添加或覆蓋的實(shí)例方法
@param classMethods: 要添加或覆蓋的類(lèi)方法
// OC
@implementation JPTestObject
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{}
@end
// JS
defineClass("JPTableViewController", {tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {...},})
2.使用雙下劃線(xiàn) __ 代表原OC方法名里的下劃線(xiàn) _ :
// OC
@implementation JPTableViewController
- (NSArray *) _dataSource {}
@end
// JS
defineClass("JPTableViewController", {
__dataSource: function() {},})
3.在方法名前加 ORIG 即可調(diào)用未覆蓋前的 OC 原方法:
// OC
@implementation JPTableViewController
- (void)viewDidLoad {}
@end
// JS
defineClass("JPTableViewController", {viewDidLoad: function() {self.ORIGviewDidLoad();},})
覆蓋類(lèi)方法
defineClass() 第三個(gè)參數(shù)就是要添加或覆蓋的類(lèi)方法,規(guī)則與上述覆蓋實(shí)例方法一致:
// OC
@implementation JPTestObject
+ (void)shareInstance{}
@end
// JS
defineClass("JPTableViewController", {//實(shí)例方法}, {//類(lèi)方法shareInstance: function() {...},})
覆蓋 Category 方法與覆蓋普通方法一樣:
@implementation UIView (custom)
- (void)methodA {}
+ (void)clsMethodB {}
@end
defineClass('UIView', {methodA: function() {}}, {clsMethodB: function() {}});
Super:使用 self.super() 接口代表 super 關(guān)鍵字趋惨,調(diào)用 super 方法:
// JS
defineClass("JPTableViewController", {viewDidLoad: function() {
? ? ? ? ?self.super().viewDidLoad();
}})
Property:獲取/修改 OC 定義的 Property鸟顺,用調(diào)用 getter / setter 的方式獲取/修改已在 OC 定義的 Property
// OC
@interface JPTableViewController
@property (nonatomic) NSArray *data;
@property (nonatomic) NSString *shareURL;
@property (nonatomic) NSString *shareTitle;
@end
@implementation JPTableViewController
@end
// JS
defineClass("JPTableViewController", {
viewDidLoad: function() {
? ? ? ? ? ? ? var data = self.data();? ? //get property value
? ? ? ? ? ? ? self.setData(data.toJS().push("JSPatch"));? ? //set property value
? ? ? ? ? ? ? ?var sel = self;
? ? ? ? ? ? ? ?self.bridge().registerHandler_handler('h5ToNativeShareDialog', block('NSDictionary ? ?*',function(data,responseCallback) {
? ? ? ? ? ? ? ? sel.setShareURL(data.objectForKey('url'));
? ? ? ? ? ? ? ? sel.setShareTitle(data.objectForKey('title'));
? ? ? }));
})
動(dòng)態(tài)新增 Property,可以在 defineClass() 第二個(gè)參數(shù)為類(lèi)新增 property器虾,格式為字符串?dāng)?shù)組诊沪,使用時(shí)與 OC property 接口一致:
defineClass("JPTableViewController", ['data', 'totalCount'], {
init: function() {
? ? ? ? ? self = self.super().init()
? ? ? ? ? self.setData(["a", "b"])? ? //添加新的 Property (id data)
? ? ? ? ? self.setTotalCount(2)
? ? ? ? ? return self
},
viewDidLoad: function() {
? ? ? ? ? ?var data = self.data()? ? //獲取 Property 值
? ? ? ? ? ?var totalCount = self.totalCount()
? ? ? ? ? },
})
私有成員變量,使用 valueForKey() 和 setValue_forKey() 獲取/修改私有成員變量:
// OC
@implementation JPTableViewController {
? ? ? ? ? NSArray *_data;
}
@end
// JS
defineClass("JPTableViewController", {
? ? ?viewDidLoad: function() {
? ? ? ? ? ?var data = self.valueForKey("_data")? ? //get?
? ? ? ? ? ?self.setValue_forKey(["JSPatch"], "_data")? ? //set?
? ? ? },
})
添加新方法曾撤,可以給一個(gè)類(lèi)隨意添加 OC 未定義的方法,但所有的參數(shù)類(lèi)型都是 id:
// OC
@implementation JPTableViewController
- (void)viewDidLoad
{
? ? ? ? ? ?NSString* data = [self dataAtIndex:@(1)];
? ? ? ? ? ?NSLog(@"%@", data);? ? ? //output: Patch
}
@end
// JS
var data = ["JS", "Patch"]
? ? ?defineClass("JPTableViewController", {?
? ? ? ? ? ? ?dataAtIndex: function(idx) {
? ? ? ? ? ? ?return idx < data.length ? data[idx]: ""
? ? ? }
})
Protocol晕粪,可以在定義時(shí)讓一個(gè)類(lèi)實(shí)現(xiàn)某些 Protocol 接口挤悉,寫(xiě)法跟 OC 一樣:
defineClass("JPViewController: UIViewController<UIScrollViewDelegate,UITextViewDelegate>", {})
這樣做的作用是,當(dāng)添加 Protocol 里定義的方法巫湘,而類(lèi)里沒(méi)有實(shí)現(xiàn)的方法時(shí)装悲,參數(shù)類(lèi)型不再全是 id,而是自動(dòng)轉(zhuǎn)為 Protocol 里定義的類(lèi)型:
//OC
@protocol UIAlertViewDelegate<NSObject>?
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
@endde
//JS
fineClass("JPViewController: UIViewController<UIAlertViewDelegate>", {
viewDidAppear: function(animated) {
? ? ?var alertView = require('UIAlertView')
? ? ? ? ?.alloc()
? ? ? ? ? .initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles(
? ? ? ? ? ?"Alert",
? ? ? ? ? ?self.dataSource().objectAtIndex(indexPath.row()),
? ? ? ? ? ?self,
? ? ? ? ? "OK",
? ? ? ? ? ?null
? ? ? ? ?)
? ? ? ? ?alertView.show()
? ? }?
? ? alertView_clickedButtonAtIndex: function(alertView, buttonIndex) {
? ? ? ? ? ?console.log('clicked index ' + buttonIndex)
? ? ?}
})