1

javascript Sencha ベースのビューをレンダリングするために、ストーリーボードからインスタンス化された UIViewController(SenchaViewController) に Cordova CleaverView (CDVViewController) を挿入しようとしました。

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

if (![ self.slidingViewController.underLeftViewController isKindOfClass:[MenuViewController class]]) {
    self.slidingViewController.underLeftViewController  = [self.storyboard instantiateViewControllerWithIdentifier:@"Menu"];    
}   

self.view.layer.shadowOpacity = 0.75f;
self.view.layer.shadowRadius = 10.0f;
self.view.layer.shadowColor = [UIColor blackColor].CGColor;


CDVViewController *cdvc = [CDVViewController new];

cdvc.wwwFolderName = @"www";
cdvc.startPage = @"sencha.html";
cdvc.useSplashScreen = NO;


if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{
    cdvc.view.frame = CGRectMake(0, 0, 768, 1004);
} else {
    cdvc.view.frame = CGRectMake(0, 0, 320, 460);
} 

[self.view addSubview:cdvc.view];
[self.view  bringSubviewToFront:self.menuButton];
[self.view  bringSubviewToFront:self.favButton];
cdvc = nil;

NSString *jsSetIdString = [NSString stringWithFormat:@"fetchGuid = function(){return '%@';}", [player valueForKey:@"playerID"]]; 
[[cdvc webView] stringByEvaluatingJavaScriptFromString:jsSetIdString];

[self.view addGestureRecognizer:self.slidingViewController.panGesture];

}

私の問題は、CDVViewController のビュー インスタンスを所有する親 ViewController(SenchaViewController) を削除した後、CDVViewController が解放されず、コンソールに JavaScript のログが表示されるため、バックグラウンドで実行されていることです。複数の CDVViewController を一度に実行する原因。

これは、アプリが親ビュー コントローラーを追加する方法です。

- (void)renderPlayer:(NSNotification*)notification {
SenchaViewController* newTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SenchaView"];
NSDictionary *player = notification.object;

// Set active player
if( player != nil && [player valueForKey:@"playerID"] != @"" ){        
    // Attach Player Dictionary to Sencha View
    newTopViewController.player = player;

    // Send it to the top
    CGRect frame = self.slidingViewController.topViewController.view.frame;
    self.slidingViewController.topViewController = newTopViewController;
    self.slidingViewController.topViewController.view.frame = frame;
}

これは、CDVController を所有する親ビュー コントローラーが削除される方法です。

_topViewController.view removeFromSuperview];
[_topViewController willMoveToParentViewController:nil];
[_topViewController removeFromParentViewController];

何か不足していますか?私はARCが私のためにこれを解放すると思っていました

4

1 に答える 1

0

Cordova にはいくつかの汚れた側面があり、これはその 1 つです。CDVViewController を削除するだけではリリースされません。[controller dispose] メソッドも呼び出す必要があります。

于 2012-10-09T02:46:53.673 に答える