2015-09-24 19 views

risposta

18

Finalmente ho capito da solo. Devi sostituire la proprietà preferredFoucsedView del tuo UIView o UIViewController.

a Swift va in questo modo:

func myClickHandler() { 
    someCondition = true 
    self.setNeedsFocusUpdate() 
    self.updateFocusIfNeeded() 
    someCondition = false 
} 

override weak var preferredFocusedView: UIView? { 
    if someCondition { 
     return theViewYouWant 
    } else { 
     return defaultView 
    } 
} 

non riesco a ricordare come ignorare getter in Objective-C, quindi se qualcuno vuole inviare che Io modificare la risposta.

+0

Grazie. Stavo pensando di farlo in questo modo, ma sembra davvero disordinato mettere tutte queste "condizioni" dappertutto. Sarebbe molto più semplice se potessi semplicemente impostarePreferredFocusedView ... –

+0

Ma, aspetta. Come funziona quando voglio cambiare lo stato attivo su un altro viewcontroller? –

+2

Sono d'accordo. Spero che lo aggiungeranno. Inoltre, per evitare tutto il 'someCondition's, ho aggiunto una proprietà' viewToFocus' 'UIView' al mio viewController. Poi nel getter, controllo se quella vista non è nulla e la restituisco. Altrimenti restituisci la vista predefinita. – Slayter

5

qui è l'obiettivo 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; 

} 

nel vostro viewDidLoad o vista è comparso fare qualcosa di simile:

UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init]; 
    focusGuide.preferredFocusedView = [self preferredFocusedView]; 
    [self.view addLayoutGuide:focusGuide]; 

se si vuole farlo quando si lancia il primo

+0

Sto ottenendo nill per la cella e sto usando collectionview invece di tableview! Qualche idea sul perché sia ​​nulla? –

14

Qui è un'altra implementazione basata sulla risposta di Slayters sopra. È un po 'più elegante che penso di usare i booleani condizionali.

mettere questo nel vostro 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; 
    } 
} 

Poi da utilizzare nel codice

viewToFocus = myUIView; 
+0

questo è stato dichiarato obsoleto in iOS 10. il suggerimento utilizzando preferredFocusEnvironments – nyxee

0

@ risposta s' elu5ion, ma in Objective-C prima dichiarare:

@property (nonatomic) UIView *preferredView; 

Impostare questi metodi:

-(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

Ecco un bel po 'di Swift frammento 2 copia/incolla:

var myPreferredFocusedView: UIView? 
override var preferredFocusedView: UIView? { 
    return myPreferredFocusedView 
} 
func updateFocus(to view: UIView) { 
    myPreferredFocusedView = napDoneView 
    setNeedsFocusUpdate() 
    updateFocusIfNeeded() 
} 

usare in questo modo:

updateFocus(to: someAwesomeView) 
9

per IOS 10 si dovrebbe utilizzare preferredFocusEnvironments invece di preferredFocusedView.

Nell'esempio seguente se si desidera concentrarsi su btnEnglish, vedere il codice riportato di seguito.

@IBOutlet weak var btnEnglish:UIButton! 

override var preferredFocusEnvironments : [UIFocusEnvironment] { 

    //condition 
    return [btnEnglish] 
} 
override func viewDidLoad() { 
    super.viewDidLoad() 

    self.setNeedsFocusUpdate() 
    self.updateFocusIfNeeded() 
} 
+0

Questa dovrebbe essere la risposta accettata ora poiché 'preferredFocusedView' è in fase di svalutazione. –

Problemi correlati