Wprowadzam niestandardowy kod do obsługi kliknięcia przycisku Menu na pilocie Siri. Jak zmusić fokus do zmiany mojego menu niestandardowego po naciśnięciu przycisku menu?Jak zmusić fokus do zmiany widoku w tvOS?
Odpowiedz
W końcu sam to wymyśliłem. Musisz zastąpić właściwość preferredFoucsedView
swojego urządzenia UIView
lub UIViewController
.
w Swift to idzie tak:
func myClickHandler() {
someCondition = true
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
someCondition = false
}
override weak var preferredFocusedView: UIView? {
if someCondition {
return theViewYouWant
} else {
return defaultView
}
}
nie mogę sobie przypomnieć, jak zastąpić pobierające w Objective-C, więc jeśli ktoś chce pisać, że będę edytować odpowiedź.
tutaj jest celem 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;
}
w viewDidLoad lub widoku stawiła zrobić coś takiego:
UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
focusGuide.preferredFocusedView = [self preferredFocusedView];
[self.view addLayoutGuide:focusGuide];
jeśli chcesz to zrobić, kiedy po raz pierwszy uruchamia
Otrzymuję Nill dla komórki i używam collectionview zamiast tableview! Każdy pomysł, dlaczego jest zerowy? –
Tu to kolejna implementacja oparta na powyższej odpowiedzi Slayters. Jest nieco bardziej elegancko niż w przypadku warunkowych booleans.
umieścić to w swoim 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;
}
}
Potem go używać w kodzie
viewToFocus = myUIView;
to było nieaktualne w iOS 10. sugestia using preferredFocusEnvironments – nyxee
@ odpowiedź elu5ion „s, ale w Objective-C pierwszy deklarować:
@property (nonatomic) UIView *preferredView;
Ustaw następujące metody:
-(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;
}
Oto miły mały Swift 2 kopiuj/wklej fragment:
var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
myPreferredFocusedView = napDoneView
setNeedsFocusUpdate()
updateFocusIfNeeded()
}
Używaj go tak:
updateFocus(to: someAwesomeView)
dla iOS 10 należy użyć preferredFocusEnvironments zamiast preferredFocusedView.
W poniższym przykładzie, jeśli chcesz skupić się na btnEnglish, zobacz poniższy kod.
@IBOutlet weak var btnEnglish:UIButton!
override var preferredFocusEnvironments : [UIFocusEnvironment] {
//condition
return [btnEnglish]
}
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
}
To powinno być zaakceptowaną odpowiedzią, ponieważ 'preferredFocusedView' jest amortyzowany. –
Dziękuję. Rozważałem robienie tego w ten sposób, ale wydaje mi się, że takie wszystkie "pewne warunki" są wszędzie. Byłoby o wiele łatwiej, gdybyś mógł ustawićPreferredFocusedView ... –
Ale, czekaj. Jak to działa, gdy chcę zmienić fokus na inny kontroler viewcontroller? –
Zgadzam się. Mam nadzieję, że dodadzą go. Aby uniknąć wszystkich 'niektórych warunków', dodałem właściwość' viewToFocus' 'UIView' do mojego viewController. Następnie w geterze sprawdzam, czy ten widok nie jest zerowy i zwrócę go. W przeciwnym razie zwróć domyślny widok. – Slayter