2016-03-11 17 views
7

Zaimplementowałem peek i pop w mojej aplikacji i działa idealnie. Ale ciągle próbując go przez 7-8 razy, aplikacja zawiesza się w widoku podglądu. Jedyną dostępną opcją jest zabicie aplikacji i ponowne uruchomienie. Proszę podać przyczynę zamrożenia. Użyłem następujący kod dla Peek i pop w moim projekcie:Aplikacja jest marznąca w implementacji "peek and pop" w 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) 
} 

Odpowiedz

2

Jest to problem Przyniosłem do inżynierów nad w Apple miesięcy temu z braku odpowiedzi od nich tak daleko. Jeśli debugujesz hierarchię widoków, zauważysz, że warstwa UITransitionView jest najwyższym widokiem i nie jest usuwana. To właśnie powoduje zawieszenie się aplikacji. W rzeczywistości funkcjonalność aplikacji nie jest zamrożona - nadal działa zgodnie z oczekiwaniami, ale interfejs użytkownika jest "zablokowany". Oto mój oryginalny wpis tutaj na Stack Overflow: Force Touch animation freezes if gently touched

+0

Mam ten sam problem z xCode 9 GM ... Nie mam podwójnych połączeń ... czy kiedykolwiek otrzymałeś dodatkowe informacje? – HixField

1

Znalazłem przyczynę tego błędu.

Jeśli kontroler widoku musi obsługiwać podgląd w celu wymuszenia użycia siły, należy zarejestrować to polecenie vc za pomocą polecenia delegowania, wywołując metodę - (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0);, aby to zrobić.

Po prostu nagle wywołuję tę funkcję dwa razy (jeden raz w super klasie viewDidLoad(), raz w sub vc), a kiedy raz usunę w moim sub vc, ten błąd naprawiony! Niesamowita ...

To nadal jest błąd Apple, ponieważ nie ma na to wpływu. Jednak żałuję, że ta odpowiedź nie pomoże programistom, którzy mają ten sam problem ze mną.

+0

wszelkie aktualizacje dotyczące błędu? –

+0

@UmarFarooque Usuń jeden raz dzwoniąc dla tej funkcji poprawiono mój problem. – kimimaro

1

Znalazłem inny możliwy powód tego błędu.

W viewControllerForLocation I instancja kontrolera widoku, aby pokazać ...

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

... ale to ViewController miał zły super-rozmowy w jego viewDidAppear:

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

Po zamocowaniu tego problemu wszystko działało zgodnie z oczekiwaniami.