• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

UIWebView vorladen bevor pushViewController aufgerufen wird

MoFuRo

Jamba
Registriert
10.06.10
Beiträge
55
Hallo zusammen,

ich habe zwei verschiedene ViewController. Der erste pusht den zweiten auf den Stack. Im zweiten ViewController befindet sich eine WebView die ich vorladen möchte bevor der zweite ViewController angezeigt wird. Gerade ist es so das der zweite ViewController angezeigt wird und der Inhalt der WebView erst nach 1 sec. geladen wird. Das möchte ich verhindern.

Das UIWebViewDelegate besitzt die webViewDidFinishLoad Funktion die ausgeführt wird wenn der Inhalt geladen wird. Wie kann ich das für meine Zwecke nutzen? Das Push befindet sich im ersten ViewController und die WebView im zweiten.

Danke ;-)
 
Das UIWebViewDelegate besitzt die webViewDidFinishLoad Funktion die ausgeführt wird wenn der Inhalt geladen wird. Wie kann ich das für meine Zwecke nutzen?
Na, wo liegt das Problem? Dann machst Du halt den ersten ViewController zum Delegate des WebView und pushst Du eben in der webViewDidFinishLoad Methode den zweiten ViewController auf den Stack. Allerdings würde ich mich fragen, ob das so schlau ist, wenn der Anwender irgendwo drauf tappt und dann erst mal nichts passiert.

MacApple
 
Es ist nur wenig Content der geladen wird, deswegen ist kaum mit Wartezeit zu rechnen.

Nun aber zum Code. Ich habe es ausprobiert so zu machen wie du es gesagt hast, jedoch wird die webViewDidFinishLoad Methode nicht aufgerufen. Der Code sieht so aus:

first.h

Code:
@interface first : UIViewController <UIWebViewDelegate> {
	MelkScoreViewController *melkView;	
}

first.m

Code:
- (void)showView{
         second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
         second.webView.delegate = self;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
	[self.navigationController pushViewController:second animated:YES];
}

second.h

Code:
@interface MelkScoreViewController : UIViewController <UIScrollViewDelegate> {
	UIWebView *webView;
}

@property (nonatomic, retain) UIWebView *webView;

second.m
Code:
- (void)viewWillAppear:(BOOL)animated {
	[super viewWillAppear:animated];
        
        webView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 395, 300, 100)];
	webView.backgroundColor = [UIColor clearColor];
	[webView setOpaque:NO];
	[self.view webView];
	
	NSString *html = @"<html><head><title>Test</title></head><body>test</body>"];
	[webView loadHTMLString:html baseURL:[NSURL URLWithString:nil];
}

Ich hoffe das das überhaupt so gemeint war :-) Der Compiler lässt alles durchgehen, so falsch kann es ja nicht sein :-D
 
Ja, so war das schon gemeint. Du erzeugst allerdings in der Methode viewWillAppear: eine neue webView Instanz. Die Zuweisung des Delegate machst Du aber schon in showView, also bevor viewWillAppear: aufgerufen wird. Das heißt, der webView, der den html String läd, hat gar kein Delegate Objekt zugewiesen bekommen. Folglich kann die Delegate-Methode auch nicht aufgerufen werden.

Die Zeile
Code:
[self.view webView];
kommt mir aber komisch vor.

MacApple
 
Erstens mal glaube ich dir ja kaum, dass da der Compiler nicht meckert. Da sind schon nur allein 2 Syntaxfehler, 1 fehlende Instanzvariable, 1 nicht definierte Klasse, ... drin. Geh mal noch ein Wenig über die Bücher.

Die Syntaxfehler:

Code:
NSString *html = @"<html><head><title>Test</title></head><body>test</body>"];
[webView loadHTMLString:html baseURL:[NSURL URLWithString:nil];
Eine ']' (schliessende eckige Klammer) zu viel in der ersten Zeile und in der zweiten jedoch dann zu wenig.

Zweitens, wie MacApple sagt, fügst du dem WebView eine delegate zu, wenn dies noch gar nicht existiert. Zudem ja auch die Klasse SecondViewController gar nicht existiert.

Gruss ppocket
 
Danke für die Antworten. Die Syntaxfehler sind nur durch das aufbereiten des Codes für diesen Post entstanden. In Xcode passt dann soweit alles. Ich habe den Code dann jetzt geändert und die WebView in first erzeugt. Gehen tut es immer noch nicht.

First.h

Code:
@interface First : UIViewController <UIWebViewDelegate> {
	MelkScoreViewController *melkView;	
}

First.m

Code:
- (void)showView{
         second = [[Second alloc] initWithNibName:@"Second" bundle:nil];
         [COLOR="red"]second.webView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 395, 300, 100)];[/COLOR]
         second.webView.delegate = self;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
	[self.navigationController pushViewController:second animated:YES];
}

Second.h

Code:
@interface Second : UIViewController <UIScrollViewDelegate> {
	UIWebView *webView;
}

@property (nonatomic, retain) UIWebView *webView;

Second.m
Code:
- (void)viewWillAppear:(BOOL)animated {
	[super viewWillAppear:animated];
        
	webView.backgroundColor = [UIColor clearColor];
	[webView setOpaque:NO];
	[self.view webView];
	
	NSString *html = @"<html><head><title>Test</title></head><body>test</body>";
	[webView loadHTMLString:html baseURL:[NSURL URLWithString:nil]];
}
 
Zuletzt bearbeitet:
Das kann auch nicht funktionieren, weil viewWillApear: erst aufgerufen wird, nachdem der ViewController gepushed wurde.

MacApple
 
Alles klar, hatte es gerade selbst herausgefunden. Manchmal hilft ein wenig nachdenken :-)
 
Was soll die Zeile '[self.view webView]'? Sollte das nicht 'self.view = webView' heissen?

Gruss ppocket