Я (и остальная часть нашей команды в моей компании) предпочитаю повышать исключения вместо того, чтобы возвратить коды ошибки. Коды ошибки должны быть проверены везде, розданы и иметь тенденцию делать код нечитабельным, когда объем кода становится больше.
ошибочный класс тогда определил бы сообщение.
пз: и на самом деле также забота об интернационализации!
PPS: Вы могли также переопределить метод повышения и добавить вход, фильтруя и т.д. при необходимости (в средах эластина, где Классы исключений и друзья являются растяжимыми/изменяемыми)
MPMoviePlayerController создает свое собственное окно и устанавливает его в качестве ключевого окна - вы, вероятно, уже знаете это из примера приложения MoviePlayer.
Я не знаю почему, но есть задержка, когда player использует поток - поэтому keyWindow, которое вы получаете сразу после инициализации проигрывателя, скорее всего, не является окном проигрывателя, поскольку оно, кажется, будет добавлено позже.
Вы можете "обмануть" и использовать таймер, чтобы получить окно проигрывателя несколько раз секунд спустя и добавьте свое наложение:
[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(addMyOverlay:) userInfo:nil repeats:FALSE]
Или вы можете прослушать событие UIWindowDidBecomeKeyNotification и сделать то же самое:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];
Ни один из вариантов не подходит (я бы хотел узнать более чистый способ сделать это), но он получает работа сделана.
Предыдущий ответ был основан на таймере. & фиксированные 5 секунд.
Когда запускается Movie player, в приложение добавляется новое окно.
Используйте таймер, чтобы проверить, добавлено ли новое окно в ваше приложение или нет.
Когда окно (Movie Player) окно) добавлено. установить уведомления.
-(void)viewDidLoad{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
// Register to receive a notification when the movie has finished playing.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:nil];
// Register to receive a notification when the movie scaling mode has changed.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieScalingModeDidChange:)
name:MPMoviePlayerScalingModeDidChangeNotification
object:nil];
videoListController.xmlClassVideoList=t;
// here ttttt is a timer declared in .h file
tttttt=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(startMy) userInfo:nil repeats:YES];
}
-(void)startMy{
NSArray *windows = [[UIApplication sharedApplication] windows];
NSLog(@"%i",[windows count]);
// depends on your application window
// it may be 1/2/3
if ([windows count] > 3) {
// Locate the movie player window
[tttttt invalidate];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];
}
}
Вы можете наложить свое представление, когда получите уведомление «MPMoviePlayerContentPreloadDidFinishNotification».
Зарегистрируйтесь для уведомления:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
Добавить представление наложения при получении уведомления:
// Notification called when the movie finished preloading.
- (void) moviePreloadDidFinish:(NSNotification*)notification
{
NSArray *windows = [[UIApplication sharedApplication] windows];
if ([windows count] > 1)
{
// Locate the movie player window
UIWindow *moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];
if ([moviePlayerWindow viewWithTag:0x3939] == nil) {
self.videoOverlayView.tag = 0x3939;
[moviePlayerWindow addSubview:self.videoOverlayView];
}
[moviePlayerWindow bringSubviewToFront:self.videoOverlayView];
}
}