【问题标题】:UIWebView Delegate : webViewDidFinishLoad not being calledUIWebView 委托:未调用 webViewDidFinishLoad
【发布时间】:2013-08-06 04:02:55
【问题描述】:

我尝试加载 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 是否被处理掉了?

附言它看起来像这个 question 的副本,但它不是。


替代方法 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. Web 视图应自动适应内容的大小(无需滚动);这就是为什么需要webViewDidFinishLoad
  3. 在当前视图(或者可能是 UIScrollView)上正确排列 Web 视图,以使其不重叠。

【问题讨论】:

  • 在类级别声明 UIWebView *web_view 属性。它会解决这个问题。
  • 刚试过。我加了web_view.h,还是一样。
  • 这绝对可以。尝试清理项目/删除构建文件夹等...它应该可以工作。
  • 参见刚刚添加的“替代方法 2”。
  • 尝试像@property (nonatomic, strong) UIWebView *web_view; 这样声明属性而不是使用 _web_view = [[UIWebView alloc]...

标签: objective-c uiwebview uiwebviewdelegate


【解决方案1】:

你应该这样做,

@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 视图在加载时正确调用委托。

【讨论】:

  • 我想在添加到当前视图之前评估UIWebView 的内容高度。您的解决方案根本无法处理 webViewDidFinishLoad
  • 你的主要问题是 webView 没有调用 webViewDidFinishLoad 方法。所以我上面的代码将使网络视图调用每个网络视图的方法。您没有要求在问题的任何地方找到评估身高的解决方案。编辑您的问题并提出解决方案来评估网络视图的高度。这样有人可以回答你,包括我.. :)
  • 编辑了问题;那你能给点灯吗?
【解决方案2】:

如果您使用 ARC,则 web_view 在 for 循环结束时被释放。

【讨论】:

  • 是的,使用了ARC,那么解决方法是什么?
  • 请避免发布一个班轮问题/说明作为答案。
  • 您需要将 UIWebView 存储在 ViewController 中的某个位置,可能在 NSMutableArray 属性中。
  • Tim,如果你看到代码,那么他已经通过“self.webViews addObject”在某个数组中添加了 WebView。因此,循环中生成的 web-views 不会在循环结束时释放。
【解决方案3】:

这是我的最终解决方案(希望对其他人有用):

在 Storyboard 中,我在视图控制器中添加了 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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多