AppDelegate.m 需要将数据发送到单独的 ViewController 的 WebView
Posted
技术标签:
【中文标题】AppDelegate.m 需要将数据发送到单独的 ViewController 的 WebView【英文标题】:AppDelegate.m needs to send data to a separate ViewController's WebView 【发布时间】:2013-12-27 05:43:06 【问题描述】:- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
if ([url.scheme isEqualToString:@"mycustomscheme"])
NSString *urlString = @"http://google.com/";
NSURL *urlString = [NSURL URLWithString:urlString];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[tapView loadRequest:loadObj];
“tapView”(一个 UIWebView)在“ViewController.m”中工作得很好,但是当我在“AppDelegate.m”中使用它时它就不起作用了。我需要做些什么才能让这段代码在我的“AppDelegate.m”文件中运行。我会很感激一步一步的解释,因为我是一名网页设计师,而不是程序员,呵呵。 :)
我的代码试图做的是检测在 Safari 中加载的“mycustomscheme://”,当然还要启动应用程序,然后将 google.com 加载到 UIWebView 中(以证明它正在工作)。我不知何故需要连接 tapView 以便它由 AppDelegate.m 操作。
【问题讨论】:
ViewController 是你窗口的根视图控制器吗? 我不这么认为。老实说,我不知道。 (额外信息:我使用了一个非常简单的设置,包括 AppDelegate.m、ViewController.m、情节提要,当然还有 main.m 文件——但实际上它只是一个 WebView 应用程序,webview 在 ViewController.m 中) 那么,没错,ViewController就是窗口的rootViewController。 【参考方案1】:最好让 ViewController 自己加载 Web 视图,因此您应该在该控制器中创建一个方法来处理该操作(在 ViewController.m 中):
-(void)loadWebViewFromAppDelegate
NSString *urlString = @"http://google.com/";
NSURL *urlString = [NSURL URLWithString:urlString];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[tapView loadRequest:loadObj]; // I'm assuming that tapView is a property or outlet in this controller
在应用委托中,获取对该控制器的引用,并调用其方法,
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
if ([url.scheme isEqualToString:@"mycustomscheme"])
ViewController *vc = (ViewController *)self.window.rootViewController;
[vc loadWebViewFromAppDelegate];
【讨论】:
嘿,我以前尝试过这样的事情,但我显然遗漏了一些东西......它在我的 AppDelegate.m 文件中显示了一个警告和一个错误......初始化 ViewController 的指针类型不兼容一个 UIViewController 类型的表达式...,在它下面是 No visible @interface for ViewController 声明选择器 loadWebViewFromAppDelegate @daemon,您是否将 ViewController.h 导入到应用程序委托 .m 文件中? #import "ViewController.h" 在顶部,是的。 @daemon, 你需要把 -(void)loadWebViewFromAppDelegate;在 ViewController 的 .h 文件中,以便编译器知道该方法存在。 @daemon,另外,我在定义 vc 的那一行忘记了演员表——请参阅我的编辑。【参考方案2】:@daemon 使用 NSNotificaitonCenter
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
if ([url.scheme isEqualToString:@"mycustomscheme"])
NSDictionary *aDict=[NSDictionary dictionaryWithObject:@"http://google.com/" forKey:@"urlToLoad"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"LoadRequestFromAppDel" object:Nil userInfo:aDict];
在你的视图控制器中添加观察者
- (void)viewDidLoad
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(LoadRequestFromAppDel:) name:@"LoadRequestFromAppDel" object:Nil];
// Do any additional setup after loading the view, typically from a nib.
-(void)LoadRequestFromAppDel:(NSNotification*)aNotif
NSString *aStrUrl=[[aNotif userInfo] objectForKey:@"urlToLoad"];
NSURL *urlString = [NSURL URLWithString:aStrUrl];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[tapView loadRequest:loadObj];
【讨论】:
我最终将其用于最终集成。它将 url 完美地传递到另一个视图。两种解决方案都有效,但我发现这个最适合我的需求。 任务完成后别忘了移除观察者 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LoadRequestFromAppDel" object:Nil];【参考方案3】:创建一个新的控制器来加载 UIWebView
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
if ([url.scheme isEqualToString:@"mycustomscheme"])
// here
WebViewController* webView = [[WebViewController alloc] init];
[self.navigationController pushViewController:webView animated:NO];
【讨论】:
以上是关于AppDelegate.m 需要将数据发送到单独的 ViewController 的 WebView的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从 AppDelegate 传递到 ViewController?
将 AppDelegate.h 和 AppDelegate.m 替换为 AppDelegate.swift
Cordova 插件 - 将方法附加到 AppDelegate