【问题标题】:calling javascript objective-c without visible uiwebview在没有可见 uiwebview 的情况下调用 javascript Objective-c
【发布时间】:2013-07-09 09:58:34
【问题描述】:

我想从我的 Objective-c 中调用 javascript 函数。这适用于 iphone。我了解如何使用这一行完成对 javascript 函数的调用

NSString *returnValue = [webView stringByEvaluatingJavascriptFromString:method];

但我实际上并不希望将 webview 视为 UI 的一部分或将其用作 UI 的一部分。那么我可以在以某种方式调用上面的方法之前创建它的一个实例吗?

我试过了:

UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectZero];
[webView loadRequest:[NSUrLRequest requestWithUrl:url]];

但似乎什么也没发生。那么有没有我打算使用的类似于上面的方法。

【问题讨论】:

  • 将它添加到视图不是主要问题。请参阅我的答案以获得完整的解决方案。

标签: javascript objective-c uiwebview


【解决方案1】:

在控制器视图中添加 webview 以运行 javascript。它不可见,因为它的高度和宽度为零。

【讨论】:

  • 我在考虑会发生类似情况之前将其添加到视图中,但我收到错误“应用程序窗口应该有一个根视图控制器”
  • 你在哪里尝试添加它?您应该在视图控制器中执行此操作。 [self addSubview:web view];
  • 我之前一定是做错了什么,因为我又试了一次,这次成功了。非常感谢您的帮助。
  • 抱歉,有轻微的后续问题,但我的 returnValue 没有采用 NSString 作为结果。你知道为什么会这样吗??在控制台中它说 @
  • 返回值:脚本运行的结果,如果失败则返回nil。交叉检查一下。它可能为零。
【解决方案2】:

您的问题与UIWebView 的大小无关。这只是一个时间问题。以下代码可根据需要使用零矩形UIWebView 实例。注意UIWebViewDelegate 方法webViewDidFinishLoad: 的使用。 UIWebView 很慢,视图加载其内容并准备好接受 JavaScript 命令需要时间。

@interface NGViewController () <UIWebViewDelegate>
@property (nonatomic, strong) UIWebView *hiddenWebView;
@end

@implementation NGViewController

@synthesize hiddenWebView = _hiddenWebView;

- (void)viewWillLayoutSubviews
{
  [super viewWillLayoutSubviews];

  if (!self.hiddenWebView.superview)
  {
    [self.view addSubview:self.hiddenWebView];
  }
}

- (UIWebView *)hiddenWebView
{
  if (!_hiddenWebView) {
    _hiddenWebView = [UIWebView.alloc initWithFrame:CGRectZero];
    _hiddenWebView.delegate = self;
    [_hiddenWebView loadHTMLString:@"<html><head><script>window.james = 'My name';</script></head><body><h1>Hidden Web View by James</h1></body></html>" baseURL:nil];
  }
  return _hiddenWebView;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
  NSString *documentBodyString = [self.hiddenWebView stringByEvaluatingJavaScriptFromString:@"window.james;"];
  NSLog(@"The body's inner HTML is: %@", documentBodyString);
}

@end

其输出为:

2013-07-09 03:13:29.347 WebViewTest[14261:c07] The body's inner HTML is: My name

【讨论】:

  • 我不能不只使用 webViewDidFinishLoad 而不是手动延迟吗??
  • @walsh06 — 你试过了吗?关键是您有时间问题,我为您提供了一个工作示例。我已经更新了答案以表明委托方法也有效。
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 2011-01-18
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多