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 文件中[关闭]

将 AppDelegate.h 和 AppDelegate.m 替换为 AppDelegate.swift

Cordova 插件 - 将方法附加到 AppDelegate

将“import <RestKit/RestKit.h>”添加到 AppDelegate.m 的问题

将意图从工作人员发送到单独应用程序中的活动