1

.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这句话。

谢谢回答我的人。我确实从你的回答中学到了。

4

2 回答 2

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...]; }
于 2012-12-13T16:00:32.790 回答
0

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

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

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

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

阅读有关您的问题的视图控制器遏制的更多信息。

于 2012-12-13T12:08:10.327 回答