2016-03-11 13 views
7

Ich habe Peek und Pop in meiner App implementiert und es funktioniert perfekt. Aber wenn ich es sieben- bis achtmal probiert habe, bleibt die App auf dem Bildschirm stehen. Die einzige Option, die ich habe, ist die App zu töten und neu zu starten. Bitte lassen Sie mich den Grund für das Einfrieren wissen. Ich habe den folgenden Code für peek und Pop in meinem Projekt verwendet:App friert in 'Peek and Pop' Implementierung 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) 
} 

Antwort

2

Dies ist ein Problem, das ich habe so weit von ihnen ohne Antwort vor Monaten an die Ingenieure über bei Apple gebracht. Wenn Sie die Ansichtshierarchie debuggen, werden Sie feststellen, dass ein UITransitionView-Layer die oberste Ansicht darstellt und nicht entfernt wird. Das hat die App zum Einfrieren gebracht. Eigentlich ist die Funktionalität der App nicht eingefroren - es funktioniert immer noch wie erwartet, aber die Benutzeroberfläche ist "festgefahren". Hier ist mein ursprünglicher Beitrag hier auf Stack Overflow: Force Touch animation freezes if gently touched

+0

Ich habe das gleiche Problem mit xCode 9 GM ... Ich habe keine Doppelanrufe ... haben Sie jemals irgendwelche zusätzlichen Informationen bekommen? – HixField

1

Ich habe einen Grund für diesen Fehler gefunden.

Wenn Ihr View Controller die Vorschau für Force Touch unterstützt, müssen Sie dieses vc mit dem Delegaten registrieren, indem Sie die Methode - (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0); aufrufen, um dies zu tun.

Ich rufe diese Funktion einfach zweimal (einmal in der Superklasse viewDidLoad(), einmal in Subvc), und wenn ich einmal in meinem Subvc entferne, wird dieser Fehler behoben! Erstaunlich ...

Es ist immer noch ein Apple-Bug, da es keinen Sinn macht für das passiert. Wünsche diese Antwort kann jedoch Entwickler helfen, die das gleiche Problem mit mir hat.

+0

irgendwelche Updates auf dem Fehler? –

+0

@UmarFarooque Löschen Sie eine Zeit des Aufrufs für diese Funktion mein Problem behoben. – kimimaro

1

Ich fand einen anderen möglichen Grund für diesen Fehler.

Im viewControllerForLocation ich einen View-Controller ... in seiner viewDidAppear

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

... aber das Viewcontroller hatte einen falschen Super Anruf zeigen instanziiert:

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

Nach dieser Frage Festsetzung alles hat wie erwartet funktioniert.

Verwandte Themen