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 はビュー コントローラーです。そして、2番目のケースでは、それをビューのように扱っています。ビュー コントローラのビューを直接追加する場合、呼び出されたすべてのビュー コントローラ メソッドが取得されるわけではありません。正しい機能を得るには、何か違うことをしなければなりません。

別のView Controllerにいて、次に別のView Controllerにいると仮定すると、MyView View Controllerのビューを追加したいときはいつでも、次のようにします

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

ただし、その前に、正しい命名規則を使用してください。UIViewController のサブクラスに MyView という名前を付けると、混乱します。MyViewController という名前を付けます。そうすれば、物事をよりよく追跡できるようになります。

問題のView Controllerの封じ込めについて詳しく読んでください。

于 2012-12-13T12:08:10.327 に答える