![](/img/trans.png)
[英]webViewDidFinishLoad not being called with loadHTMLString
[英]UIWebView Delegate : webViewDidFinishLoad not being called
我尝试加载与委托关联的UIWebView数组。
for (GDataXMLElement *post in array) {
NSString *msg = [[[post elementsForName:@"message"] objectAtIndex:0] stringValue];
UIWebView *web_view = [[UIWebView alloc] initWithFrame:CGRectZero];
web_view.delegate = self;
[web_view loadHTMLString:msg baseURL:nil];
NSLog(@"Msg: %@", msg);
}
msg
是从XML读取的一些HTML代码。 XML已正确加载(通过NSLog
行验证)。 然后在我的webViewDidFinishLoad:
:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
NSLog(@"WebView Height: %.1f", webView.frame.size.height);
[webviews addObject:webView];
}
我自动调整Web视图的大小并将其添加到名为webviews
的NSMutableArray
。 但是,不会调用webViewDidFinishLoad
。
在标头.h
文件中,接口定义为:
@interface ViewController : UIViewController<UIWebViewDelegate>
我错过了什么? 循环中的web_view
是否被处置?
ps看起来像是这个问题的重复,但事实并非如此。
替代方法1
在.h
声明:
@property (nonatomic, weak) NSMutableArray *webviews;
然后执行:
for (GDataXMLElement *post in array) {
NSString *msg = [[[post elementsForName:@"message"] objectAtIndex:0] stringValue];
UIWebView *web_view = [[UIWebView alloc] initWithFrame:CGRectZero];
web_view.delegate = self;
[web_view loadHTMLString:msg baseURL:nil];
NSLog(@"Msg: %@", msg);
[self.webviews addObject:web_view];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
NSLog(@"WebView Height: %.1f", webView.frame.size.height);
}
替代方法2
我没有在for-loop
中实例化UIWebView
,而是将其放在头文件中。
@interface ViewController : UIViewController<UIWebViewDelegate> {
UIWebView *web_view;
}
然后更改for循环:
for (GDataXMLElement *post in array) {
NSString *msg = [[[post elementsForName:@"message"] objectAtIndex:0] stringValue];
web_view = [[UIWebView alloc] initWithFrame:CGRectZero];
web_view.delegate = self;
[web_view loadHTMLString:msg baseURL:nil];
NSLog(@"Msg: %@", msg);
[self.webviews addObject:web_view];
}
在这种方法中,仅最后一条消息的委托被调用。
摘要和重点:
我的目标:
UIWebView
webViewDidFinishLoad
的原因。 UIScrollView
)上正确排列Web视图,以使其不重叠。 你应该这样
@interface UIViewController <UIWebViewDelegate>
{
}
@property(nonatomic, strong)NSMutableArray *webViews;
@end
////////////////
@implementation UIViewController
-(void)viewDidLoad
{
[super viewDidLoad];
webViews = [[NSMutableArray alloc] init];
for (GDataXMLElement *post in array)
{
NSString *msg = [[[post elementsForName:@"message"] objectAtIndex:0] stringValue];
UIWebView *web_view = [[UIWebView alloc] initWithFrame:CGRectZero];
web_view.delegate = self;
[web_view loadHTMLString:msg baseURL:nil];
NSLog(@"Msg: %@", msg);
[self.webViews addObject:web_view];
//i don't know why would you not add these web-views on the view controller,
// but still, here is the addition of these.
[self.view addSubView:web_view];
}
}
@end
这应该使Web视图在加载时正确调用委托。
如果您使用的是ARC,则将web_view释放在for循环的末尾。
这是我的最终解决方案(希望对其他人有用):
在情节提要中,我在视图控制器中添加了UIScrollView
,并将其与IBOutlet
链接。
头文件:
#import <UIKit/UIKit.h>
#import "GDataXMLNode.h"
@interface ViewController : UIViewController<UIWebViewDelegate> {
IBOutlet UIScrollView *scroll_view;
}
@property (nonatomic, strong) UIWebView *web_view;
@end
实施文件:
float currentY;
NSArray *array;
int count;
GDataXMLDocument *doc;
- (void)viewDidLoad
{
[super viewDidLoad];
currentY = 0;
count = 0;
[self loadXML];
}
- (void)loadXML {
// Some codes to load the XML contents into array variable
[self loadWebView];
}
- (void)loadWebView {
if(count < array.count) {
GDataXMLElement *post = [array objectAtIndex:count];
NSString *msg = [[[post elementsForName:@"message"] objectAtIndex:0] stringValue];
count++;
self.web_view = [[UIWebView alloc] initWithFrame:CGRectMake(10, currentY, 300, 1.0f)];
self.web_view.delegate = self;
[self.web_view setHidden:YES];
[self.web_view loadHTMLString:msg baseURL:nil];
[scroll_view addSubview:self.web_view];
} else {
// end the process
[scroll_view setContentSize:CGSizeMake(320, currentY + 30)];
return;
}
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
[webView setHidden:NO];
currentY += webView.frame.size.height + 20.0f; // 20.0f is spaces between posts
NSLog(@"WebView Height: %.1f", webView.frame.size.height);
[self loadWebView];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.