iOS UIWebView与JavaScript交互

1.UIWebView调用JavaScript

1.1调用html中已有的JavaScript function

假设html中的JavaScript有名为JSFunction(arg)的函数,可用如下方法调用:

1
2
3
NSString *js = [NSString stringWithFormat:@"JSFunction('OC---Call-->JS')"];

NSString *result = [self.webView stringByEvaluatingJavaScriptFromString:js];

1.2注入JavaScript function,然后调用

我们还可以先向html中注入JavaScript function,然后调用。 通常可以在UIWebViewDelegate中注入。示例如下:

1
2
3
4
5
6
7
-(void)webViewDidFinishLoad:(UIWebView *)webView {

    [self.webView stringByEvaluatingJavaScriptFromString:@"function injectJSFunction (parameter) { return parameter + 1;}"];
}

// Call injectJSFunction from somewhere else
    NSString *result = [self.webView stringByEvaluatingJavaScriptFromString:@"injectJSFunction(1)"];
继续阅读

(翻译)Property Values

现场教学的一部分乐趣是应付问题和独立思考。在我展示了一些在类中广泛使用的 @property 代码,其中一个学生问到"@property 后面繁琐的字段都是什么?我已经使用了 retain, assign 和 nonatomic,但我真的不知道它们真正是干什么用的。"(如果你仅仅只是想要一份快速参考,文章最后有所有的 @property 属性。)

对于许多 Objective-C 程序员来说,@property 就像一个神奇的护身符。添加一些像这样的代码给你的狗对象一个名字:

1
@property (copy, nonatomic) NSString *puppyName;

把它放到 Xcode 的代码片断库中,当需要它时粘贴进来然后编辑它。

@property 是一个属性声明,它有两个目的:声明一个或两个方法,当你使用这些方法时简洁地描述它们的运行时语义。

我声明

@property 声明是声明访问器方法的简写。这些方法让你从对象获取值(嘿 puppy,你叫什么名字?)或者改变值(puppy 欢迎回家,现在你的名字是 Rumperlstiltskin)。下面就是类声明中的 property 声明:

1
2
3
@interface Puppy: NSObject
@property NSString *puppyName;
@end
继续阅读

(翻译)Tips and Techniques for Framework Developers

Initialization

Class initialization

initialize 类方法是一个一次性,懒散的执行一些代码的地方,它会在类的其他方法被调用之前调用。最典型的应用是设置类的版本号。 动态系统给继承链上每一个类发送initialize方法,即使方法没有实现。因此它可能会被调用多次(例如,一个子类没有实现它。)。通常我们只想初始化代码被执行一次。一种实现的方法是使用dispatch_once();

1
2
3
4
5
6
7
8
9
10
11
+ (void)initialize {

static dispatch_once_t onceToken = 0;

dispatch_once(&onceToken, ^{

    // the initializing code

}

}

Note:因为动态系统发送initialize给每一个类,所以它很可能会在子类的上下文中调用—如果子类没有实现initialize,会调用父类的实现。如果在相关类的上下文中有特殊的初始化需求,我们可以进行如下操作而不仅仅是使用dispatch_once();

1
2
3
4
5
if (self == [NSFoo class]) {

    // the initializing code

}
继续阅读