2010-07-13 30 views
3

Ok, je pense que c'est possible J'ai mal compris la bonne façon d'implémenter un écran externe sur l'iPad et cela me cause beaucoup de maux de tête. Comme il s'agit d'un post long, ce que j'essaie de faire est de créer et d'envoyer une vue à un écran externe sur VGA, et de supprimer l'écran une fois que j'en ai fini avec elle. Je dois retenir les problèmes de comptage, donc je ne peux pas le faire fonctionner.Manipulation d'un écran externe sur l'iPad

J'ai un contrôleur de vue qui peut être appelé sur l'iPad à tout moment. Lorsque cette vue est chargée (il s'agit d'une télécommande, similaire à la présentation Keynote), je recherche un écran externe, puis crée une fenêtre et ajoute une vue au moniteur supplémentaire.

dans mon ipadViewController.h < - le point de vue qui reste sur le

iPad

Je

@interface ipadViewController : UIViewController { 

PresentationViewController *presentationView; 
UIScreen *externalScreen; 
UIWindow *externalWindow; 
} 

@property (nonatomic, retain) UIScreen *externalScreen; 
@property (nonatomic, retain) UIWindow *externalWindow; 
@property (nonatomic, retain) PresentationViewController *presentationView; 
@end 

(Il y a plus, mais c'est la substance de l'écran externe).

dans ipadViewController.m:

@synthesize externalScreen; 
@synthesize externalWindow; 
@synthesize presentationView; 

J'essaie donc de faire quelques petites choses lorsque la vue des charges:

Obtenez l'écran externe (si possible) Créer une presentationViewController et l'ajouter à l'écran supplémentaire

- (void)viewDidLoad { 
[super viewDidLoad]; 

[self getExternalScreen]; 
[self createPresentationAndSendToWindow]; 
} 

pour obtenir l'écran, je ne l'getExternalScreen: suivante:

if ([[UIScreen screens] count] > 1) 
{ 
    for (UIScreen *currentScreen in [UIScreen screens]) 
    { 
     if (currentScreen != [UIScreen mainScreen]) 
      self.externalScreen = [currentScreen autorelease]; 
    } 

} 

et d'envoyer la vue de ce createPresentationAndSendToWindow::

if (self.presentationPath == nil) return; 
PresentationViewController *viewController = [[PresentationViewController alloc] initWithNibName:@"CanvasPresentation" bundle:nil]; 


self.presentationView = viewController; 
[viewController release]; 

if (self.externalWindow == nil) 
{ 
    CGRect externalBounds = [self.externalScreen bounds]; 
    self.externalWindow = [[[UIWindow alloc] initWithFrame:externalBounds] autorelease]; 

    [self.externalWindow addSubview:self.presentationView.view]; 

    self.externalWindow.screen = self.externalScreen; 

    [self.externalWindow makeKeyAndVisible]; 
} 

dans dealloc J'essaie de nettoyage avec:

[presentationView release]; 
[externalScreen release]; 
//[externalWindow release]; <- that would crash 

Problème J'ai est que lorsque je rejette la remoteViewController (il est modal), après avoir libéré externalScreen a un nombre de retenue = 1 et externalWindow a retenir count = 2.

Le plantage causé par externalWindow release disparaît si je ne libère pas presentationView (mais alors je fuis presentationView.

Répondre

1

Votre problème est ici:

for (UIScreen *currentScreen in [UIScreen screens]) 
{ 
    if (currentScreen != [UIScreen mainScreen]) 
     self.externalScreen = [currentScreen autorelease]; 
} 

Retirez le autorelease. Vous ne devriez pas publier quelque chose que vous n'avez pas créé ou conservé.

0

vous autoreleasing externalView sur

self.externalWindow = [[[UIWindow alloc] initWithFrame:externalBounds] autorelease]; 

puis vous attribuez une vue autorelease à elle

self.externalScreen = [currentScreen autorelease]; 

vous ne pouvez pas libérer une vue autoreleased, ou il va se planter.