尚未调用UIWebViewDelegate函数

时间:2012-12-13 11:56:05

标签: objective-c ios uiwebview asihttprequest uiwebviewdelegate

.h文件:

@interface MyView: UIViewController <UIWebViewDelegate> {
    UIWebView *webView;
}

.m文件:

-(void)viewDidLoad {
    CGRect webFrame = [[UIScreen mainScreen] applicationFrame];
    webView= [[UIWebView alloc] initWithFrame:webFrame];
    webView.delegate = self;
    [self.view addSubview:webView];
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]];
}

-(void)webViewDidStartLoad:(UIWebView *)webView {
    NSLog(@"start");    
}   

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"finish");   
}

-(void)dealloc {
    webView.delegate = nil;
    webView = nil;
}

在另一个ViewController中创建MyView:

MyView * myView = [[MyView alloc] init];
[self.view addSubView:myView.view];
myView = nil;

myView设置为nil,因此其委托也被销毁。

要解决此问题,删除myView = nil。

的句子 谢谢那些回答我的人。我确实从你的答案中学到了。

2 个答案:

答案 0 :(得分:1)

正如srikanth所说,myview是一个控制器,它需要在屏幕上被告知并保留,所以它不会消​​失,这是你的直接你案件中的真正问题(我认为)。没有人保留myView。 使它成为一个成员变量,因此在它给你的视图后它不会被直接释放:)。

@interface MyCallerWithDoesTheASI : NSObject {
    MyView *myView;
}
@end

或者做正确并添加就像srikanth所说 ::

[self addChildViewController:myView];
[self.view addSubview:myView.view];
[myView didMoveToParentViewController:self];

或者例如并呈现myView模式

[self presentViewController:myView animated:NO completion:^{ [[myView dismiss...]; }

答案 1 :(得分:0)

MyView是一个视图控制器。在第二种情况下,你将它视为一种观点。如果要直接添加视图控制器的视图,则不会获取所有调用的视图控制器方法。为了能够获得正确的功能,您将不得不做一些不同的事情。

假设您在另一个视图控制器中,然后在另一个视图控制器中,当您想要添加MyView视图控制器的视图时,请执行以下操作

[self addChildViewController:myView];
[self.view addSubview:myView.view];
[myView didMoveToParentViewController:self];

但即使在此之前,请使用正确的命名约定。如果您将UIViewController的子类命名为MyView,您将会感到困惑。将其命名为MyViewController。这样,您就能更好地跟踪内容。

详细了解您的问题的视图控制器控制。