Как работает уведомление overlayViewTouched в примере кода MoviePlayer

У меня есть вопрос относительно примера кода MoviePlayer, предоставленного Apple.
Я не понимаю, как работает уведомление overlayViewTouch. Сообщение NSlog, которое я добавил к нему, не отправляется, когда я касаюсь вида (не кнопки).

// post the "overlayViewTouch" notification and will send
// the overlayViewTouches: message
- (void)overlayViewTouches:(NSNotification *)notification
{
    NSLog(@"overlay view touched");
    // Handle touches to the overlay view (MyOverlayView) here... 
}

Однако я могу получить уведомление NSlog, если я помещу его в -(void)touchchesBegan в "MyOverlayView.m". Что заставляет меня думать, что распознает прикосновения, но не отправляет уведомление.

 // Handle any touches to the overlay view
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch* touch = [touches anyObject];
        if (touch.phase == UITouchPhaseBegan)
        {
            NSLog(@"overlay touched(from touchesBegan")
            // IMPORTANT:
            // Touches to the overlay view are being handled using
            // two different techniques as described here:
            //
            // 1. Touches to the overlay view (not in the button)
            //
            // On touches to the view we will post a notification
            // "overlayViewTouch". MyMovieViewController is registered 
            // as an observer for this notification, and the 
            // overlayViewTouches: method in MyMovieViewController
            // will be called. 
            //
            // 2. Touches to the button 
            //
            // Touches to the button in this same view will 
            // trigger the MyMovieViewController overlayViewButtonPress:
            // action method instead.

            NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
            [nc postNotificationName:OverlayViewTouchNotification object:nil];



  }    
}

Может ли кто-нибудь пролить свет на то, что я упускаю или делаю неправильно?

Спасибо.

2 ответа

Это потому, что оверлейный вид маленький. Вы можете увидеть область, покрытую видом наложения, изменив цвет фона вида наложения. Уведомление будет доставлено, когда вы коснетесь области.

Как мне кажется, в примере кода отсутствует вызов селектора addObserver для Notification. Пример регистрации можно найти в AppDelegate:

[[NSNotificationCenter defaultCenter] addObserver:self 
                 selector:@selector(moviePreloadDidFinish:) 
                 name:MPMoviePlayerContentPreloadDidFinishNotification 
                 object:nil];

Как и в документации NSNotificationCenter. Когда объект (известный как отправитель уведомления) публикует уведомление, он отправляет объект NSNotification в центр уведомлений. Центр уведомлений затем уведомляет любых наблюдателей, для которых уведомление соответствует критериям, указанным при регистрации, отправляя им указанное уведомление, передавая уведомление в качестве единственного аргумента.

Если нет наблюдателей, никто не будет проинформирован NSNotificationCenter.

Просто добавьте соответствующий регистр в init, например.

[[NSNotificationCenter defaultCenter] addObserver:self 
                 selector:@selector(overlayViewTouches:) 
                 name:OverlayViewTouchNotification 
                 object:nil];
Другие вопросы по тегам