2016-09-09 61 views
5

Chcę wyświetlić UIAlertController na wierzchu urządzenia UIViewController z wewnątrz UICollectionView. Widok kolekcja musi skoncentrować się na starcie, więc overrode zmienną preferredFocusableView następująco:Fokus znika po otwarciu kontrolera UIAlert na sterowniku TVOS 10 GM

override var preferredFocusedView: UIView? { 
    return self.collectionView 
} 

Z tvOS 9 wszystko działało w porządku: alert kontroler otwarte prawidłowo i byłem w stanie wybrać jeden z UIAlertAction s wyświetlane.

Na TVOS 10 Golden Master, po otwarciu kontrolera alertu i przewinięciu do innej akcji, fokus zniknie z ekranu i nie mogę przewinąć do innych akcji lub stukając w przycisk Menu na pilocie Siri. Aplikacja utknęła w kontrolerze alertu i słyszę przewijany dźwięk, gdy próbuję przewinąć do innych działań, ale nic się nie dzieje na ekranie. Muszę wymusić zamknięcie aplikacji i ponowne jej otwarcie.

enter image description here enter image description here

To jest kod aplikacji. Próbowałem ustawić preferredFocusableView na alertController.preferredFocusedView lub poprzez usunięcie metod ustawiania ostrości w widoku kolekcji, ale bez wyników.

var alertController : UIAlertController? 

func showAlert() { 

    alertController = UIAlertController(title:"Example title", message: "Example description", preferredStyle: .Alert) 

    let action1 = UIAlertAction(title: "Option 1", style: .Default) { (action : UIAlertAction) -> Void in 
     //call to another method 
    } 

    // action2, action3, action4... 

    let action5 = UIAlertAction(title: "Option 5", style: .Default) { (action : UIAlertAction) -> Void in 
     //call to another method 
    } 

    let actionDismiss = UIAlertAction(title: "Dismiss", style: .Destructive) { (action : UIAlertAction) -> Void in 
     self.alertController!.dismissViewControllerAnimated(true, completion: nil) 
    } 

    alertController!.addAction(action1) 
    alertController!.addAction(action2) 
    alertController!.addAction(action3) 
    alertController!.addAction(action4) 
    alertController!.addAction(action5) 
    alertController!.addAction(actionDismiss) 

    alertController!.preferredAction = action1 

    self.presentViewController(alertController!, animated: true, completion: nil) 
} 

override var preferredFocusedView: UIView? { 
    if self.alertController != nil { 
     return self.alertController!.preferredFocusedView 
    } else { 
     return self.collectionView 
    } 
} 
+0

Gdzie nazywasz 'showAlert'? –

+0

@ Danielpar, gdy użytkownik dotknie pilota na przycisku w kontrolerze widoku –

+0

preferredFocusedView został uznany za przestarzały w tvOS10 https://developer.apple.com/reference/uikit/uifocusenvironment/1616830-preferredfocusedview –

Odpowiedz

4

Jabłko właśnie odpowiedział na moim radarze:

Wewnątrz załączony aplikacji, zastępujesz funkcję z UIScrollView w rozszerzeniu, aby zwrócić true dla canBecomeFocused(), co jest przyczyną te niespodziewane efekty po stronie. Wygląda na to, że fokus znika po przejściu do drugiej opcji UIAlertController; jednakże w rzeczywistości przenosi on skupienie do widoku przewijania owiniętego wokół różnych składników UIAlertController, ponieważ jest to obecnie dozwolone z powodu wspomnianego wyżej rozszerzenia .

Aby rozwiązać ten problem, należy utworzyć niestandardową podklasę UIScrollView być stosowane tylko w przypadkach, gdy canBecomeFocused() musi powrócić true.

1

Nadpisujesz cały system fokusowania systemu. Spróbuj tego:

// MARK: - Update Focus Helper 
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 
    } 
} 

Następnie ustawić alert, jak widok, gdy chcemy skupić się zmienić do niego:

viewToFocus = someView 
+0

Nadal nie działa :(I ' m ustawianie ostrości po prezentacji UIAlertController Obie metody działają poprawnie, ale ostrość nadal znika. –