2016-08-05 43 views
3

Ich habe die webView in Methode viewDidLoad in ViewcontrollerAbsturz nach WebView Delegierter Einstellung

UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
id <UIWebViewDelegate> delegate =[[MyDelegate alloc] init]; 
webView.delegate = delegate; 
NSError *error; 
NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; 

NSString *htmlContent = [[NSString alloc] initWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:&error]; 
[webView loadHTMLString:htmlContent baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; 

[self.view addSubview:webView]; 

ich die Delegierten auf Instanz der Klasse MyDelegate entwickelt.

In MyDelegate Klasse:

#import <UIKit/UIKit.h> 

@interface MyDelegate : NSObject <UIWebViewDelegate> 

@end 



#import "MyDelegate.h" 

@implementation MyDelegate 

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

    return YES; 

} 
@end 

Aber mein Absturz App während der loasding starten. Wenn ich nicht HTML-Inhalt laden, aber URL ("google.com" zum Beispiel) Absturz passiert.

Wenn ich diese 'webView.delegate = Delegate kommentieren' Absturz passiert nicht.

Ich weiß, dass ich dies in ViewController.h verwenden:

@interface ViewController : UIViewController<UIWebViewDelegate> 

und dies in viewDidLoad:

webView.delegate = self; 

aber ich brauche andere Klasse als Delegierter verwenden (nicht Viewcontroller), aber webview muss sich in ViewController befinden.

Wie kann ich das machen? Hilf mir!

+0

für andere Klasse als Delegierten können Sie Protokoll verwenden. –

+0

Danke für den Kommentar, aber was meinst du? Ich benutze Protokoll UIWebViewDelegate. Brauche ich ein anderes Protokoll? – Katya

+0

Was ist die Absturzmeldung? –

Antwort

0
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    id<UIWebView> delegate =(id)self; 
    webView.delegate = delegate; 
    NSError *error; 
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; 

    NSString *htmlContent= [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:&error]; 
    [webView loadHTMLString:htmlContent baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; 

    [self.view addSubview:webView]; 
} 

MyDelegate.h

#import <UIKit/UIKit.h> 

@protocol UIWebView <UIWebViewDelegate> 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 


@end 
@interface MyDelegate : NSObject 
@end 
0

In Ihrem Viewcontroller selbst können Sie UIWebViewDelegate implementieren.

- (void) viewDidLoad {

[super viewDidLoad]; 

UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
webView.delegate = self; 

NSError *error; 

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; 

NSString *htmlContent= [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:&error]; 
[webView loadHTMLString:htmlContent baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; 

[self.view addSubview:webView]; 

}

- (BOOL) WebView: (UIWebView *) webView should: (NSURLRequest *) Anfrage navigationType: (UIWebViewNavigationType) navigationType {

return YES; 

}

1

Lassen Sie mich auf die Ursache hinweisen. Das UIWebView-Delegatenattribut ist eine schwache Referenz ("unowned (unsafe)" im Swift-Quellcode), was bedeutet, dass der Speicher jederzeit freigegeben werden kann.

Um dies zu lösen, müssen Sie eine Referenz in Ihrem Controller als Klassenattribut behalten.

Beispiel Lösung erfolgreich in Swift getestet:

class MyUIViewController : UIViewController{ 
    let leftDelegate:MyWebViewDelegate = MyWebViewDelegate() 
    ... 
} 
0

ich eine separate Antwort veröffentlichen, weil ich denke, dass eine Notwendigkeit gibt es explizite Objective-C-Lösung zur Verfügung zu stellen, da OP könnte David GONZALEZ Antwort verpassen, weil es in ist Schnell, obwohl er es absolut geschafft hat.

Das Problem ist, dass der Delegat delegiert wurde, wenn die Webansicht seinen Delegaten aufruft.So wäre die Lösung Eigenschaft MyDelegate Typ ViewController private Erweiterung Erklärung hinzuzufügen sein:

@interface ViewController() 
@property (nonatomic, strong) MyDelegate* webViewDelegate; 
@end 

Und dann in dieser Eigenschaft in -viewDidLoad erstellt MyDelegate Instanz zu speichern:

... 
id <UIWebViewDelegate> delegate =[[MyDelegate alloc] init]; 
webView.delegate = delegate; 
self. webViewDelegate = delegate; 
...