J'implémente un code personnalisé pour gérer un clic sur le bouton Menu de Siri Remote. Comment puis-je forcer le focus à changer de menu personnalisé lorsque j'appuie sur le bouton de menu?Comment puis-je forcer le focus à passer à une vue spécifique dans tvOS?
Répondre
Enfin compris moi-même. Vous devez remplacer la propriété preferredFoucsedView
de votre UIView
ou UIViewController
.
En rapide, il va comme ceci:
func myClickHandler() {
someCondition = true
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
someCondition = false
}
override weak var preferredFocusedView: UIView? {
if someCondition {
return theViewYouWant
} else {
return defaultView
}
}
Je ne me souviens pas très bien comment passer outre getters dans Objective-C, donc si quelqu'un veut poster que je vais modifier la réponse.
ici est l'objectif 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;
}
dans votre viewDidLoad ou vue ne semble faire quelque chose comme ceci:
UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
focusGuide.preferredFocusedView = [self preferredFocusedView];
[self.view addLayoutGuide:focusGuide];
si vous voulez le faire lors de son lancement
Je reçois zéro pour la cellule et j'utilise collectionview au lieu de tableview! Une idée de pourquoi c'est nul? –
ici est une autre implémentation basée sur la réponse de Slayters ci-dessus. C'est un peu plus élégant je pense que d'utiliser les booléens conditionnels.
Mettez dans votre 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;
}
}
ensuite l'utiliser dans votre code
viewToFocus = myUIView;
cela a été déprécié dans iOS 10. the suggérer using preferredFocusEnvironments – nyxee
@ réponse de l » elu5ion, mais objective-c premier déclare:
@property (nonatomic) UIView *preferredView;
Définissez ces méthodes:
-(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;
}
est ici un joli petit Swift 2 copier/coller extrait:
var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
myPreferredFocusedView = napDoneView
setNeedsFocusUpdate()
updateFocusIfNeeded()
}
utiliser comme ceci:
updateFocus(to: someAwesomeView)
Pour ios 10 vous devez utiliser preferredFocusEnvironments au lieu de preferredFocusedView.
Dans l'exemple ci-dessous si vous voulez vous concentrer sur btnEnglish, voir ci-dessous le code.
@IBOutlet weak var btnEnglish:UIButton!
override var preferredFocusEnvironments : [UIFocusEnvironment] {
//condition
return [btnEnglish]
}
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
}
Cela devrait être la réponse acceptée maintenant puisque 'preferredFocusedView' est déprécié. –
Merci. J'envisageais de le faire comme ça, mais il me semble tellement bizarre de mettre toutes ces «conditions» partout. Serait tellement plus facile si vous pouviez simplement définirPreferredFocusedView ... –
Mais, attendez. Comment cela fonctionne-t-il lorsque je veux changer le focus sur un autre viewcontroller? –
Je suis d'accord. J'espère qu'ils l'ajouteront. Aussi, pour éviter tous les 'someCondition's, j'ai ajouté une propriété' viewToFocus' 'UIView' à mon viewController. Ensuite, dans le getter, je vérifie si cette vue n'est pas nulle et la renvoie. Sinon, renvoyez l'affichage par défaut. – Slayter