当按下遥控器上的菜单按钮时,Apple TV App不会从初始视图控制器退出到主屏幕

时间:2015-10-23 12:14:56

标签: objective-c tvos apple-tv siri-remote

我因为

而拒绝了Apple TV应用

'此外,Siri Remote上的菜单按钮在您的应用中的行为与预期不符。 具体来说,当用户启动应用程序并点击Siri遥控器上的菜单按钮时,该应用程序不会退出Apple TV主屏幕。'

我正在查看这个,从我可以看出这应该是在初始视图控制器上按下菜单按钮的自动行为。但是我有一个带有根视图控制器的导航控制器,通过故事板自动实例化,没有方法被覆盖,当我按下这个视图控制器上的菜单按钮时没有任何反应。

有人可以告诉我,我是否遗漏了某些内容,或者是否有手动实施此方式?

我想我可以直接按下菜单按钮并调出exit(0),但这似乎并不是一种优雅的退出方式。

6 个答案:

答案 0 :(得分:5)

我也因为这个原因拒绝了应用程序。就我而言,问题是在不调用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,主页按钮都会继续有效。

答案 1 :(得分: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];
}

答案 2 :(得分:1)

以更通用的方式,“菜单”按钮仅在某些条件下将您带到主屏幕,首先是启动应用程序并单击“菜单”按钮,然后在应用程序中,如果您在&#39; root view&#39;你的应用程序。

如果你在屏幕上显示某些东西,比如一个不受标准sdk控制的弹出窗口/对话框,而是你自己手工制作(即添加UIView作为弹出窗口),那么菜单按钮应该只是作为一个&#39;取消/返回&#39;就像在导航控制器上那样。

-(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
}

答案 3 :(得分:1)

以下是最终为我工作的代码片段:

-(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;
    }
}

答案 4 :(得分:0)

所以我最终不情愿地调用exit(0)

- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
    [super pressesBegan:presses withEvent:event];

    if (presses.anyObject.type == UIPressTypeMenu)
    {
        exit(0);
    }
}

它不像它自动工作那样整洁;你最终得到一个模糊的白色视图大约半秒钟而不是更优雅的淡出动画。然而它确实有效,我可以确认我是通过Apple的审查流程这样做的。

答案 5 :(得分:0)

对我来说,只是在您不再需要时从您的视图中删除手势识别器(对于您的菜单按钮)。

然后,当您想要菜单按钮时,返回上一个屏幕,然后再次添加手势识别器。

这样菜单按钮的工作方式应该是这样,您无需调用exit()或强制您的应用退出其他方式。