Обработка внешнего экрана на iPad - PullRequest
3 голосов
/ 13 июля 2010

Хорошо, я думаю, что это возможно. Я неправильно понял, как реализовать внешний экран на iPad, и это вызывает у меня много головной боли. Поскольку это длинный пост, я пытаюсь создать и отправить представление на внешний экран через VGA и удалить экран, как только я закончу с ним.У меня проблемы с подсчетом, поэтому я не могу заставить его работать.

У меня есть контроллер представления, который можно вызвать на iPad в любое время.Когда это представление загружается (оно является удаленным, аналогично представлению Keynote), я проверяю внешний экран, затем создаю окно и добавляю представление на дополнительный монитор.

в моем ipadViewController.h <-вид, который остается на iPad </p>

У меня есть

@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

(есть еще, но это внешний экран материал).

в ipadViewController.m:

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

Поэтому я пытаюсь сделать несколько вещей при загрузке представления:

Получить внешний экран (если возможно) Создать presentationViewController и добавить его на дополнительный экран

- (void)viewDidLoad {
[super viewDidLoad];

[self getExternalScreen];
[self createPresentationAndSendToWindow];
}

чтобы получить экран, я делаю следующее getExternalScreen::

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

}

и отправляю на него представление 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];
}

in deallocЯ пытаюсь очистить:retain count = 2.

Авария, вызванная externalWindow release, исчезает, если я не отпускаю presentationView (но затем я подтекаю presentationView.

Ответы [ 2 ]

1 голос
/ 27 декабря 2010

Ваша проблема здесь:

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

Удалите autorelease.Вы не должны выпускать то, что не создали или не сохранили.

0 голосов
/ 27 декабря 2010

вы автоматически выпускаете externalView на

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

, а затем вы присваиваете ему автоматический выпуск

self.externalScreen = [currentScreen autorelease];

вы не можете разблокировать автоматически выпущенное представление, иначе оно вылетит.

...