Приложение Apple TV не выходит на главный экран с контроллера начального вида, когда кнопка меню нажата на пульте дистанционного управления
У меня только что приложение Apple TV отклонено из-за
'Кроме того, кнопка меню на Siri Remote не действует должным образом в вашем приложении.
В частности, когда пользователь запускает приложение и нажимает кнопку "Меню" на Siri Remote, приложение не выходит на главный экран Apple TV.
Я смотрю это, и из того, что я могу сказать, должно быть автоматическое поведение нажатия кнопки меню, когда на контроллере начального представления. Однако у меня есть контроллер навигации с контроллером корневого представления, созданный автоматически через раскадровку без переопределенных методов, и ничего не происходит, когда я нажимаю кнопку меню на этом контроллере представления.
Может ли кто-нибудь сказать мне, если я что-то упустил или если есть способ реализовать это вручную?
Я думаю, что могу просто перехватить кнопку меню и нажать exit (0), но это не похоже на изящный способ выхода.
Ответы
Ответ 1
У меня просто было отклонено приложение по этой причине. В моем случае проблема заключалась в переопределении группы методов press<Phase>d:withEvent
без вызова реализации super
.
Итак, я изменил это:
-(void)pressesBegan:(NSSet*)presses withEvent:(UIPressesEvent *)event {
// my code
}
Для этого:
-(BOOL)ignoreMenu:(NSSet*)presses {
return ((UIPress *)[presses anyObject]).type == UIPressTypeMenu;
}
-(void)pressesBegan:(NSSet*)presses withEvent:(UIPressesEvent *)event {
if ([self ignoreMenu:presses]) return [super pressesBegan:presses withEvent:event];
// my code
}
И кнопка меню снова работает. Что сбивает с толку, что кнопка "Домой" продолжает работать, вы вызываете super
или нет.
Ответ 2
Мой полный рабочий код от tvOS 9.1 (скомпилирован под Objective-C ++)
bool AppRespondedToBack = false;
-(void)pressesBegan:(NSSet*)presses withEvent:(UIPressesEvent *)event
{
UIPress *UP = (UIPress *)presses.anyObject;
if ( UP && UP.type == UIPressTypeMenu )
{
//OnBack should be where you handle the back operation in your app
AppRespondedToBack = OnBack();
if ( !AppRespondedToBack )
// Let AppleTV return to the home screen
[super pressesBegan:presses withEvent:event];
}
else
[super pressesBegan:presses withEvent:event];
}
-(void)pressesEnded:(NSSet*)presses withEvent:(UIPressesEvent *)event
{
UIPress *UP = (UIPress *)presses.anyObject;
if ( UP && UP.type == UIPressTypeMenu )
{
if ( !AppRespondedToBack )
// Let AppleTV return to the home screen
[super pressesEnded:presses withEvent:event];
}
else
[super pressesEnded:presses withEvent:event];
}
Ответ 3
В более общем виде кнопка "Меню" выводит вас на главный экран только в некоторых условиях, сначала при запуске приложения и нажатии кнопки "Меню", а затем в приложении, если вы находитесь на "root view" вашего приложения.
Если вы отобразите что-то на экране, например, popover/dialog, который не контролируется стандартным sdk, а также вручную (например, добавление UIView как popover), кнопка Menu должна просто действовать как 'cancel/go назад, как это было бы на навигационном контроллере.
-(void)pressesBegan/Ended:(NSSet*)presses withEvent:(UIPressesEvent *)event {
if( presses.anyObject.type == UIPressTypeMenu) {
if ( !somePopoverDisplayed) {
// Let the sdk do its thing with the menu button
[super pressesBegan:presses withEvent:event];
} else {
// otherwise handle the menu button yourself ...
}
return;
}
// handle other buttons
}
Ответ 4
Вот фрагмент кода, который закончился для меня:
-(void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event {
if( presses.anyObject.type == UIPressTypeMenu) {
if (scene.view.paused == YES) {
// This will return to the Apple TV Menu
} else {
// This allows your code to run without exiting the app
[self pauseScene];
[super pressesBegan:presses withEvent:event];
}
return;
}
}
Ответ 5
Итак, я закончил тем, что вызывал вызов (0) так
- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
[super pressesBegan:presses withEvent:event];
if (presses.anyObject.type == UIPressTypeMenu)
{
exit(0);
}
}
Это не совсем так, как когда он работает автоматически; вы получаете размытый белый вид примерно на полсекунды вместо более изящной анимации. Однако он работает, и я могу подтвердить, что я сделал это через процесс проверки Apple, делая это таким образом.
Ответ 6
Для меня это было просто удалением распознавателя жестов с вашего вида (для кнопки "Меню" ), когда вам это больше не нужно.
Затем, когда у вас есть ситуация, когда вы хотите, чтобы кнопка меню, например, вернулась к предыдущему экрану, просто добавьте свой распознаватель жестов.
Таким образом, кнопка "Меню" работает так, как вам нужно, без необходимости вызывать exit() или заставить ваше приложение выйти другим путем.