2016-11-28 1 views
0

У меня есть UIView с двумя кнопками на нем. В MyView классе у меня есть этот код:tvOS: фокус не двигается правильно

-(BOOL) canBecomeFocused { 
    return YES; 
} 

-(NSArray<id<UIFocusEnvironment>> *)preferredFocusEnvironments { 
    return @[_editButton, _addButton]; 
} 

-(IBAction) editTapped:(id) sender { 
    BOOL editing = !tableViewController.editing; 
    [_editButton setTitle:editing ? @"Done" : @"Edit" forState:UIControlStateNormal]; 
    _addButton.hidden = !editing; 
    [tableViewController setEditing:editing animated:YES]; 

}

Основная идея заключается в том, что пользователь может переместить фокус на кнопку редактирования, которая может затем сделать кнопку Add появится.

Проблема возникла из-за того, что каждый раз, когда я нажимал кнопку редактирования, фокус переключился на представление таблицы. Мне бы очень хотелось, чтобы он переместился к кнопке «Добавить». Я также хочу, чтобы при редактировании его деактивировали, кнопка редактирования сохраняет фокус. но опять же он переходит к представлению таблицы.

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

Все, что я прочитал, говорит только о переопределении preferredFocusEnvironments, но до сих пор мне не удалось заставить это работать. Фокус продолжает двигаться к кнопке, а затем отказывается двигаться куда угодно.

Любые идеи?

+0

Это действительно сложно. Я пытаюсь теперь использовать 'UIFocusGuide', но похоже, что смещение фокуса с кнопок вниз на представление таблицы - это сгенерированное системой движение и игнорирует мое руководство по фокусировке. Хотя я и сижу между ними. Хмм. ! – drekka

ответ

0

Вы можете переопределить preferredFocusEnviromnets со следующей логикой:

-(NSArray<id<UIFocusEnvironment>> *)preferredFocusEnvironments { 
    if (condition) { 
     return @[_editButton]; 
    } 
    else { 
     return @[_addButton]; 
    } 
} 

После установки, вы можете позвонить

[_myView setNeedsFocusUpdate]; 
[_myView updateFocusIfNeeded]; 

условие может быть BOOL condition = tableViewController.editing; или SG подобное.

Если это работает, вы можете вызвать его с задержкой (0,1 с или около того).

Смежные вопросы