Как я могу заставить фокус перейти на конкретный вид в tvOS?

Я использую специальный код для обработки щелчка по кнопке меню на Siri Remote. Как я могу заставить фокус переключиться на свое пользовательское меню при нажатии кнопки меню?

Ответ 1

Наконец-то разобрался сам. Вы должны переопределить свойство preferredFocusedView вашего UIView или UIViewController.

В Swift это работает так:

func myClickHandler() {
    someCondition = true
    self.setNeedsFocusUpdate()
    self.updateFocusIfNeeded()
    someCondition = false
}

override weak var preferredFocusedView: UIView? {
    if someCondition {
        return theViewYouWant
    } else {
        return defaultView
    }
}

Я не могу вспомнить, как переопределить геттеры в Objective-C, поэтому, если кто-то захочет опубликовать это, я отредактирую ответ.

Ответ 2

Для ios 10 вы должны использовать preferredFocusEnvironments вместо предпочтительногоFocusedView.

В приведенном ниже примере, если вы хотите сфокусироваться на btnEnglish, см. ниже код.

@IBOutlet weak var btnEnglish:UIButton!

override var preferredFocusEnvironments : [UIFocusEnvironment] {

    //condition
    return [btnEnglish]
}
override func viewDidLoad() {
    super.viewDidLoad()

    self.setNeedsFocusUpdate()
    self.updateFocusIfNeeded()
}

Ответ 3

Вот еще одна реализация, основанная на ответе Slayters выше. Я немного более изящный, чем я использую условные булевы.

Поместите это в свой viewcontroller

var viewToFocus: UIView? = nil {
    didSet {
        if viewToFocus != nil {
            self.setNeedsFocusUpdate();
            self.updateFocusIfNeeded();
        }
    }
}

override weak var preferredFocusedView: UIView? {
    if viewToFocus != nil {
        return viewToFocus;
    } else {
        return super.preferredFocusedView;
    }
}

Затем, чтобы использовать его в своем коде

viewToFocus = myUIView;

Ответ 4

вот цель C

- (UIView *)preferredFocusedView
{
    if (someCondition) {
      // this is if your menu is a tableview
        NSIndexPath *ip = [NSIndexPath indexPathForRow:2 inSection:0];
        UITableViewCell * cell = [self.categoryTableView cellForRowAtIndexPath:ip];

        return cell;
    }

    return self.view.preferredFocusedView;

}

в вашем представленииDidLoad или просмотр действительно отображались примерно так:

    UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
    focusGuide.preferredFocusedView = [self preferredFocusedView];
    [self.view addLayoutGuide:focusGuide];

если вы хотите сделать это при первом запуске

Ответ 5

@elu5ion ответ, но в objective-c сначала объявите:

@property (nonatomic) UIView *preferredView;

Установите следующие методы:

-(void)setPreferredView:(UIView *)preferredView{
      if (preferredView != nil) {
         _preferredView = nil;
         UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
         [self.view addLayoutGuide:focusGuide];
         focusGuide.preferredFocusedView = [self preferredFocusedView];
         [self setNeedsFocusUpdate];
         [self updateFocusIfNeeded];
    }
    _preferredView = preferredView;
 }


 - (UIView *)preferredFocusedView {
     if (_preferredView) {
          return _preferredView;
     }
     return self.view.preferredFocusedView;
}

Ответ 6

Вот хороший фрагмент скопирования/вставки Swift 2:

var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
    return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
    myPreferredFocusedView = napDoneView
    setNeedsFocusUpdate()
    updateFocusIfNeeded()
}

Используйте его следующим образом:

updateFocus(to: someAwesomeView)