Как я могу запустить определенную кнопку на tvOS (AppleTV), чтобы сфокусироваться? (Цель С)

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

Я думаю, что это связано с setNeedsFocusUpdate. Я прочитал документ Apple. Нет ни одного примера.

Кто-нибудь знает, как это сделать и привести пример (задача C)?


person Moloixo    schedule 01.10.2015    source источник
comment
Оформить заказ Как установить canBecomeFocused для пользовательского представления.   -  person Daniel Storm    schedule 02.10.2015


Ответы (4)


Вам нужно переопределить preferredFocusedView, и когда вы скрываете одно представление и показываете там вызов этого метода setNeedsFocusUpdate, ваша preferredFocusedView реализация должна быть примерно такой

- (UIView *)preferredFocusedView
{
    // Add your logic here, it could be more complicated then what is below
    if (view1.hidden)
    {
        return _button;
    }
    else 
    {
        return _button2
    }
}

И если вы хотите, чтобы пользовательское представление получило фокус, переопределите метод canBecomeFocused и верните true

Изменить

Вы можете добавить точку останова и выполнить эту команду po [buttonYouWantToFocus _whyIsThisViewNotFocusable], она расскажет вам, почему ее нельзя сфокусировать.

person Adnan Aftab    schedule 02.10.2015
comment
Во-первых, спасибо за быстрый ответ. У меня есть представление с двумя подвидами (menuView и gameView). Когда я скрываю menuView и показываю gameView, кнопки внутри gameView не сфокусированы. Как вы сказали, мне нужно вызвать метод setNeedsFocusUpdate . Я пытаюсь позвонить, но ничего не получаю. Не могли бы вы показать мне пример, пожалуйста? - person Moloixo; 02.10.2015
comment
Убедитесь, что ваши представления доступны для фокусировки, а не скрыты, а взаимодействие с пользователем включено. - person Adnan Aftab; 02.10.2015
comment
@Moloixo добавьте точку останова и выполните эту команду на консоли po [buttonYouWantToFocus _whyIsThisViewNotFocusable] и скажите мне, что она говорит - person Adnan Aftab; 02.10.2015
comment
не переопределяйте setNeedDisplay, просто вызывайте его, когда вы скрываете и показываете вид - person Adnan Aftab; 02.10.2015
comment
вам нужно вызвать [self setNeedFocusUpdate] и добавить точку останова внутри selectedFocusedView и посмотреть, получаете ли вы там контроль, - person Adnan Aftab; 02.10.2015
comment
РЕШЕНО! setNeedsDisplay подходит, а setNeedDisplay — нет. вызов setNeedsDisplay - (UIView *)preferredFocusedView {}, а затем работает с вашим кодом. БЛАГОДАРЮ ВАС. :) - person Moloixo; 02.10.2015

Если вы программно добавляете подпредставление, возможно, это то, что вам нужно:

- (UIView *)preferredFocusedView {
    return [view1 preferredFocusedView];
}
person Per Ekstig    schedule 02.10.2015
comment
Спасибо за ответ, Пер! - person Moloixo; 02.10.2015

Я понимаю, что ваш вопрос относится к Objective-C, но вот способ решить это в Swift. Вам необходимо переопределить свойство preferenceFocusedView.

override var preferredFocusedView: UIView? {
    guard primaryView.hidden == false else {
        return secondaryView
    }
    return primaryView
}

Затем просто вызывайте setNeedsFocusUpdate() всякий раз, когда происходит событие, которое приводит к скрытию ваших представлений. Надеюсь это поможет...

person Thomas Jeans    schedule 30.03.2016

Другой вариант (если вы не хотите использовать preferredFocusedView) заключается в том, чтобы вместо того, чтобы скрывать свое представление, просто удалите его из суперпредставления, например:

myView.removeFromSuperview()

Это автоматически отводит фокус от удаленной кнопки и передает его другой кнопке, которая все еще находится на экране.

person Andra Todorescu    schedule 06.10.2016