繁体   English   中英

UIWebView委托:未调用webViewDidFinishLoad

[英]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视图的大小并将其添加到名为webviewsNSMutableArray 但是,不会调用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];
}

在这种方法中,仅最后一条消息的委托被调用。


摘要和重点:

我的目标:

  1. 加载所有具有可变大小内容的UIWebView
  2. 网络视图应自动适应内容的大小(不滚动); 这就是为什么需要webViewDidFinishLoad的原因。
  3. 在当前视图(或可能是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM