UIWebView委托混淆

时间:2016-05-04 10:58:23

标签: ios objective-c uiwebview delegates

过去几天我一直在调查UIWebViews和代表,我感到非常困惑。我想创建一个包含Web视图的storyboard视图控制器。当在Web视图中单击一个按钮时,我想根据对此的答案在视图控制器中触发一些代码:

How to invoke Objective C method from Javascript and send back data to Javascript in iOS?

但是我对如何设置我的委托感到困惑(我甚至对委托人说实话是多么困惑,这是与viewcontroller有关的webview吗?)。我一直在阅读和观看一些教程,但我不太了解这个过程,我不认为我做得对。这是我到目前为止所拥有的。

MyViewController.h

#import <UIKit/UIKit.h>

@protocol MyViewControllerDelegate;

@interface MyViewController : UIViewController
@property (nonatomic, weak) id<MyViewControllerDelegate> delegate;

@property (strong, nonatomic) IBOutlet UIWebView *MyWebView;

@end

@protocol MyViewControllerDelegate <NSObject>

-(bool)myWebView:(UIWebView*)myWebView
shouldStartLoadWithRequest:(NSURLRequest*)request
                  navigationType:(UIWebViewNavigationType)navigationType;

@end

MyViewController.m

#import "MyViewController.h"

@interface MyViewController ()
@end

@implementation MyViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [_MyWebView setDelegate:self];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewWillAppear:(BOOL)animated
{   
}

@end

我不确定实施的位置:

-(bool)myWebView:(UIWebView*)myWebView
shouldStartLoadWithRequest:(NSURLRequest*)request
                  navigationType:(UIWebViewNavigationType)navigationType;

应该去。

如果有人能提供帮助,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

代表们提供了不同活动的沟通方式。与上述方法一样,当您使用给定的URL加载webview时。

- (void)viewDidLoad {
    [super viewDidLoad];
    [_MyWebView setDelegate:self];
    NSString *urlString = @"http://google.com";
    //Create a URL object.
    NSURL *url = [NSURL URLWithString: urlString];
    //URL Request Object
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    //Load the request in the UIWebView.
    [_MyWebView loadRequest:requestObj];
}

现在使用代理webview将与您的控制器进行通信。当webview开始加载新框架时,它将调用您提到的上述方法。此方法的目的是获取您是否应该加载数据的许可?在特殊情况下,如果您不想加载webView,则可以在此方法中返回no。

还有某些其他委托方法会更新您某些阶段,例如,如果webview已加载您提到的网址内容,它将通过调用此方法告诉控制器。

- (void)webViewDidFinishLoad:(UIWebView *)webView{
 //if you want to do anything else after loading the content of webview you can write code here. for example after loading the content you want to show a button on controller you can show it here. 
}

如果由于互联网连接不足或网址无效或网页内容无法加载网页或框架。它通过调用另一个委托方法告诉控制器。

- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{

}

答案 1 :(得分:1)

首先,您需要了解授权的概念。委托可以是当事件或动作在该对象内遇到时可以代表另一个对象做出反应的对象。

例如,你可以拥有一个UIViewController,里面有一个UITbleView。 UIViewController可以有一个UITableViewDelegate。在这种情况下,所有UITableViewDelegate方法(heightForRow,ViewForFooter,didSelectRowAtIndexPath,...)都可以通过UIViewController实现。因此,例如当选择一个单元格(didSelectRowAtIndexPath)时,UIViewController可以看到选择了哪个单元格,并决定如何处理该选择。

在您的情况下,您的UIViewController中有一个UIWebView实例。您的UIViewController需要是UIWebView的委托。

@interface UIViewController () <UIWebViewDelegate>

然后在viewDidLoad中将UIWebView属性的委托设置为自己。

[self.webView setDelegate:self];

现在,您可以在viewController中调用委托方法。

-(bool)myWebView:(UIWebView*)myWebView shouldStartLoadWithRequest (NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType;

在您的视图控制器的.m文件中,并决定您要对从网络视图收到的信息做些什么。