2015-11-21 8 views
5

OK, se ho un UIViewController Posso rendere una vista focalizzata su tvOS se uso questo `preferredFocusedView ma che ne dite di mettere a fuoco la prima cella di UICollectionView? Come lo faccio?Fare la prima cella di un UICollectionView focalizzata su tvOS

Ho cercato di creare una sottoclasse UICollectionViewCell e hanno il metodo

- (UIView *)preferredFocusedView { 
    return ([self ifThisIsTheFirstCell]) ? self : nil; 
} 

senza successo.

C'è un modo per farlo?

risposta

8

Il modo "focus preferito" funziona concettualmente è che non c'è una "catena" di oggetti che iniziano dalla finestra dell'app, che passano attraverso i controller e le viste della vista, fino a quando la catena non termina in una vista focalizzabile. Quella vista alla fine è ciò che si focalizzerà quando l'app si avvia o se è necessario ripristinare lo stato attivo (ad esempio, se la vista attualmente focalizzata viene rimossa dalla gerarchia della vista, Uikit dovrà scegliere un'altra vista per diventare focalizzata) . Il metodo preferredFocusedView è il modo in cui si definisce la catena.

Ad esempio, UIWindow implementa preferredFocusedView per restituire la vista focalizzata preferita dello rootViewController. In astratto, t sta facendo qualcosa di simile:

- (UIView *)preferredFocusedView { 
    return [self.rootViewController preferredFocusedView]; 
} 

UIViewController implementa preferredFocusedView di tornare è view proprietà. UIView restituisce solo se stesso.

Tuttavia, UICollectionView implementa preferredFocusedView in modo diverso: nel caso più semplice, restituisce la prima cella. Quindi quella parte di ciò che vuoi è già fatta per te. Se l'attenzione non si sposta sulla prima cella della tua raccolta, allora qualcosa di più in alto nella "catena" è il problema.

Se la vista raccolta del controller della vista non è il view proprietà del controller della vista, allora avrete bisogno per guidare la catena di messa a fuoco per la raccolta te stesso:

// in your view controller: 
- (UIView *)preferredFocusedView { 
    return myCollectionView; 
} 

Da lì, la vista collezione sarà guida la catena alla cella specifica.

+3

Ora stiamo parlando. Mi chiedo perché Apple non ingaggia mai persone come te per scrivere la loro documentazione. Invece scrivono persone che odiano scrivere. PERFEZIONARE! GRAZIE! – SpaceDog

+0

Se si prelevano i dati da qualche servizio, non dimenticare di scrivere [self setNeedsFocusUpdate]; dopo collectionview reloadData/reloadSection. – NaXir

+0

Qualche guida per modificare in modo programmatico quale cella è focalizzata in una vista insieme? – vtcajones

-1

È necessario aggiungere questo metodo UICollectionViewDelegate e qualsiasi logica necessaria se non si vuole tornare vero in alcuni casi

func collectionView(collectionView: UICollectionView, shouldUpdateFocusInContext context: UICollectionViewFocusUpdateContext) -> Bool { 
    return true 
    } 
+0

ho questo metodo in atto, ma ora come faccio a concentro una cellula? – SpaceDog

+0

Stai chiedendo come mettere a fuoco una cella "specifica"? La tua domanda dice la "prima cella". Il metodo sopra riportato nella mia applicazione mette a fuoco la prima cella. Ma se nella tua vista ci sono più elementi attivabili, potrebbe essere necessaria un'altra soluzione: – earthtrip

+0

no, intendo la prima cella. Questo non funziona per me per qualche motivo. A proposito, perché questo metodo dovrebbe funzionare se non c'è nulla che menzioni la prima cella? Non sono sicuro se mi sto spiegando bene.Quello che voglio è: appare il ViewViewController e la prima cella è focalizzata (intendo enorme di dimensioni, come una cella focalizzata dovrebbe essere in tvOS). – SpaceDog

0

È possibile utilizzare questo metodo, Apple documentation

func indexPathForPreferredFocusedView(in collectionView: UICollectionView) -> IndexPath? { 
    return IndexPath(item: self.datasourceArray.count, section: 0) 
} 

È possibile restituire qualsiasi indexPath vuoi ..

ad esempio IndexPath(item: 0, section: 0)