2015-09-24 2 views

Répondre

18

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.

+0

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 ... –

+0

Mais, attendez. Comment cela fonctionne-t-il lorsque je veux changer le focus sur un autre viewcontroller? –

+2

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

5

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

+0

Je reçois zéro pour la cellule et j'utilise collectionview au lieu de tableview! Une idée de pourquoi c'est nul? –

14

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; 
+0

cela a été déprécié dans iOS 10. the suggérer using preferredFocusEnvironments – nyxee

0

@ 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; 
} 
0

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) 
9

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() 
} 
+0

Cela devrait être la réponse acceptée maintenant puisque 'preferredFocusedView' est déprécié. –