2016-03-11 20 views
7

Ho implementato la funzione Peek e Pop nella mia app e funziona perfettamente. Ma continuando a provarlo per 7-8 volte, l'app si blocca sulla vista. L'unica opzione che ho è di uccidere l'app e rieseguire. Per favore fammi sapere il motivo del congelamento. Ho usato il seguente codice per peek e pop nel mio progetto:L'applicazione si blocca nell'implementazione 'peek e pop' in iPhone 6s

var isPresentedBy3Dtouch: Bool = false 
var passedDetails:DetailModel! 

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { 

    guard let indexPath = tableView?.indexPathForRowAtPoint(location) 
    else { return nil } 

    guard let cell = tableView?.cellForRowAtIndexPath(indexPath) 
    else { return nil } 

    guard let detailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("Navigation") as? UINavigationController 
    else { return nil } 

    (detailViewController.topViewController as! DetailViewController).passedDetails = self.customerLists[indexPath.row] 
    (detailViewController.topViewController as! DetailViewController).isPresentedBy3Dtouch = true 
    detailVC.preferredContentSize = CGSize(width: 0.0, height: 480.0) 
    previewingContext.sourceRect = cell.frame 
    return detailVC 
} 

func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit :UIViewController) { 
    showViewController(viewControllerToCommit, sender: self) 
} 

risposta

2

Questo è un problema che ho portato fino agli ingegneri oltre alla Apple mesi fa con nessuna risposta da loro finora. Se esegui il debug della gerarchia delle viste, noterai che un livello UITransitionView è la vista più in alto e non viene rimosso. Questo è ciò che sta causando il blocco dell'app. In realtà, la funzionalità dell'app non è bloccata, ma funziona come previsto, ma l'interfaccia utente è "bloccata". Ecco il mio post originale qui su Stack Overflow: Force Touch animation freezes if gently touched

+0

Sto avendo lo stesso problema con xCode 9 GM ... Non ho doppie chiamate ... hai mai ricevuto qualche informazione aggiuntiva? – HixField

1

Ho trovato un motivo per questo errore.

Se il controller di visualizzazione deve supportare l'anteprima per forzare il tocco, è necessario registrare questo vc con il delegato chiamando il metodo - (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0); per farlo.

Ho appena chiamato questa funzione due volte (una volta nella classe super viewDidLoad(), una volta in sub vc), e quando rimuovo una volta nel mio sub vc, questo bug risolto! Incredibile ...

È ancora un bug di Apple perché non ha senso per quello che succede. Tuttavia, desidero che questa risposta possa aiutare gli sviluppatori che hanno lo stesso problema con me.

+0

eventuali aggiornamenti sul bug? –

+0

@UmarFarooque Eliminare una volta la chiamata per quella funzione risolto il problema. – kimimaro

1

Ho trovato un altro possibile motivo per questo errore.

Nel viewControllerForLocation ho istanziato un controller della vista per mostrare ...

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { 
    let vc = VCImageFullScreen.loadView() 
    return vc 
} 

... ma questo ViewController ha avuto una chiamata eccellente sbagliato nella sua viewDidAppear:

class VCImageFullScreen : UIViewController { 
     override func viewDidAppear(_ animated: Bool) { 
      super.viewWillAppear(animated) 
      //BUG --> should be super.view**Did**Appear(animated) 
      ... 
     } 
    } 

Dopo aver sistemato questo problema tutto ha funzionato come previsto.