2015-09-24 16 views

Odpowiedz

18

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

+0

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

+0

Ale, czekaj. Jak to działa, gdy chcę zmienić fokus na inny kontroler viewcontroller? –

+2

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

5

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

+0

Otrzymuję Nill dla komórki i używam collectionview zamiast tableview! Każdy pomysł, dlaczego jest zerowy? –

14

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

to było nieaktualne w iOS 10. sugestia using preferredFocusEnvironments – nyxee

0

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

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

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

To powinno być zaakceptowaną odpowiedzią, ponieważ 'preferredFocusedView' jest amortyzowany. –