2015-12-08 15 views
5

Ho aggiunto alcune funzionalità di prova 3D Touch a UITableViewController su iPhone 6s. In generale funziona bene, ma sono stato in grado di osservare alcuni 2 problemi, e non sono sicuro di cosa sta succedendo e come risolverlo in un modo normale.3D Touch e UITableViewCell

1) La mia cella è selezionabile, quindi l'utente può premere su di essa o utilizzare "3D Touch". Il problema è che quando uso "Pop" e "Peek" per UITableViewCell diventa selezionato e non riesco a deselezionare in modo normale usando i metodi setSelected: o setHighlighted:. Ho provato a deselezionarlo in diversi punti anche nel previewingContext:commitViewController nel completamento presentViewController. Non fanno nulla e le celle rimangono nello stato selezionato. Ho recuperato la cella selezionata chiamando lo reviewingContext.sourceView e un altro codice temporaneo che mi ha fornito la cella selezionata, ma questi metodi non hanno funzionato.

  • Quindi la domanda c'è un modo normale per deselezionare (o meglio non per selezionare) la cella quando l'utente applica premere "Pop" su di esso?

2) Ho anche notato che a volte, quando posso cancellare gesto "Pop" e portare cellule allo stato iniziale (quando previewingContext:viewControllerForLocation metodo è stato nemmeno chiamato) la mia interfaccia utente si blocca proprio e non risponde ai tocchi a tutti . Ho bisogno di uccidere per farlo funzionare. Sembra molto strano, ho controllato questo Tutorial. Funziona alla grande, senza problemi menzionati, ma registrano delegato non sulla cella, ma su UITableView quindi il gesto "Pop" evidenzia l'intera tableView, ma non la cella.

  • Qualche idea e cosa può essere sbagliato qui?

Ecco come ho implementato tocco 3D nel mio test UITableViewController conforme alle UIViewControllerPreviewingDelegate

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cell = tableView.dequeueReusableCellWithIdentifier("SomeDemoID", 
     forIndexPath: indexPath) as! UITableViewCell 

    // Some cell configuration 

    if #available(iOS 9.0, *) { 
     if traitCollection.forceTouchCapability == .Available { 
      self.registerForPreviewingWithDelegate(self, sourceView: cell) 
     } 
    } else { // Fallback on earlier versions} 

    return cell; 
} 


// MARK: - UIViewControllerPreviewingDelegate 

    func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? 
    { 
     // Just Test View Controller 
     return UIViewController(nibName: nil, bundle: nil) 
    } 

    func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) 
    { 
     self.presentViewController(viewControllerToCommit, animated: true, completion: nil) 
    } 

Grazie in anticipo!

risposta

0

Cerca di verificare se l'anteprima di UIViewController è già presente nel tuo metodo previewingContext(_:viewControllerForLocation:).

Qualcosa di simile

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? 
{ 
    if self.navigationController.presentedViewController.isKindOfClass(PreviewViewController) { 
     return nil 
    } 
    return PreviewViewController() 
} 
1

ho notato lo stesso problema. Penso che il problema sia causato dalla registrazione duplicata. Ho aggiunto il flag, quindi il problema è stato risolto.

Si prega di provare questo (sto usando Objective-C, quindi per favore riscrivi in ​​swift).

Implementare categoria che

@interface UITableViewCell (FourceTouchRegistered) 

@property (nonatomic, assign) BOOL fourceTouchRegistered; 

@end 

e

#import "UITableViewCell+FourceTouchRegistered.h" 
#import <objc/runtime.h> 

@implementation UITableViewCell (FourceTouchRegistered) 

- (void)setFourceTouchRegistered:(BOOL)fourceTouchRegistered 
{ 
    objc_setAssociatedObject(self, @"fourceTouchRegistered", @(fourceTouchRegistered), OBJC_ASSOCIATION_ASSIGN); 
} 

- (BOOL)fourceTouchRegistered 
{ 
    return [objc_getAssociatedObject(self, @"fourceTouchRegistered") boolValue]; 
} 

@end 

poi

if(cell.fourceTouchRegistered == NO) { 
     cell.fourceTouchRegistered = YES; 
     if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) { 
      [self registerForPreviewingWithDelegate:self sourceView:cell]; 
     } 
    }