Предотвращение выгрузки вида в iOS SDK? - PullRequest
0 голосов
/ 26 января 2011

Я создал приложение, которое использует UITableView внутри UINavigationController, внутри UITabBarController.Каждая запись в UITableView открывает представление, которое содержит некоторый основной текст, кнопки, но самое главное, MPMoviePlayerController, который воспроизводит аудио при запуске.Пользователь может щелкнуть этот MPMoviePlayerController и продолжить просматривать остальную часть приложения (различные вкладки или переходить назад в navcontroller, открывая другие представления из табличного представления) и продолжать слышать звук.как пользователь, чтобы иметь возможность вернуться к представлению с активным MPMoviePlayerController в любое время.Я понимаю, как мне было бы разрешить пользователю возвращаться к определенному представлению из любого представления, но я борюсь с тем, как предотвратить перезагрузку этого представления, когда пользователь пытается получить доступ к тому же представлению.

Есть ли способ сохранить вид в памяти?Или сохраните активный MPMoviePlayerController как некоторый тип глобального объекта, чтобы я мог по крайней мере получить к нему доступ из любого места?

Я ценю любую помощь.Спасибо!

Ответы [ 4 ]

2 голосов
/ 26 января 2011

Я бы порекомендовал вам создать свойство для MPMoviePlayerController в UIApplicationDelegate вашего приложения (к которому вы затем можете получить доступ из любого места кода с помощью [UIApplication sharedApplication] .delegate, но вам нужно будет привести его к вашему подклассу UIApplicationDelegate).*

Когда вы заходите на экран, на котором воспроизводится контент, проверьте, имеет ли свойство проигрывателя фильмов в делегате приложения ноль, если оно создается, в противном случае используйте его повторно.

Не забудьтеосвободить ссылку на ваш MPMoviePlayerController, когда носитель перестает воспроизводиться, или когда носитель уже остановлен, и вы получаете предупреждение памяти или когда ваше приложение закрывается.

Недостатком этого подхода является то, что он вызывает связь междубольшинство ваших контроллеров представления и ваше приложение делегат.Однако вы можете смягчить это, используя протокол.

0 голосов
/ 03 июля 2012

Немного хак, но вы можете переопределить setView: в своем подклассе, чтобы он никогда не позволял установить представление на nil:

-(void)setView:(UIView *)view
{
    if (view == nil) return;

    [super setView:view];
}
0 голосов
/ 24 мая 2011

Я обнаружил, что даже добавление retain не помогает. Я на самом деле нашел лучший успех с переопределением setView (так как часть выгрузки представления включает в себя вызов setView: nil. У меня есть BOOL, который устанавливается в ПЕРВЫЙ раз, когда VC загружается, и как только он устанавливается, он никогда не позволит вызывать setView. еще раз.

- (void) setView: (UIView*) view{
  NSLog(@"MainViewController: setView");

  // this is our attempt to stop iOS from unloading our view.. when iOS tries to unload your view they call setView:nil.. so, no!
  if(!viewDidAppear) [super setView:view];
}    
0 голосов
/ 26 января 2011

Вы должны просто сохранить его.Вот так [myView retain] и держите указатель на него там, где вам нужно.Если вы хотите, чтобы myView появился, просто добавьте его в качестве подпредставления к текущему видимому виду, например [myController.view addSubview:myView].

Надеюсь, что это поможет, Удачи!

...