2015-12-08 4 views
5

Я добавил несколько тестов 3D Touch на UITableViewController на iPhone 6s. В общем, он работает нормально, но я смог наблюдать некоторые 2 проблемы, и я не уверен, что происходит, и как это исправлять обычным способом.3D Touch и UITableViewCell

1) Моя ячейка выбирается, поэтому пользователь может нажать на нее или использовать «3D Touch». Проблема в том, что когда я использую «Pop» и «Peek» для UITableViewCell, он выбирается, и я не могу отменить выбор обычным способом, используя методы setSelected: или setHighlighted:. Я попытался отменить его в разных местах, даже в previewingContext:commitViewController в presentViewController завершение. Они просто ничего не делают, и клетки все еще остаются в выбранном состоянии. Я получил выбранную ячейку, вызвав reviewingContext.sourceView и другой временный код, который дал мне выбранную ячейку, но эти методы не сработали.

  • Таким образом, вопрос есть нормальный способ, чтобы отменить (или лучше не выбирать) ячейки, когда пользователь применяется «Pop», нажмите на нее?

2) Я также заметил, что иногда, когда я отменяю «Pop» жест и принести клетку в исходное состоянии (когда previewingContext:viewControllerForLocation метод не был даже называется) мой UI просто зависает и не реагирует на прикосновения на все , Мне нужно убить, чтобы он работал. Кажется очень странным, я проверил это Tutorial. Он отлично работает, без упомянутых проблем, но они регистрируют делегат не в ячейке, а на UITableView, поэтому жест «Поп» выделяет весь tableView, но не ячейку.

  • Любые мысли и что может быть неправильным здесь?

Вот как я реализовал 3D контакт в моем тесте UITableViewController который соответствует 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) 
    } 

Спасибо заранее!

ответ

0

Попробуйте проверить, представлен ли ваш предварительный просмотр UIViewController в вашем методе previewingContext(_:viewControllerForLocation:).

Что-то вроде

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

я заметил тот же вопрос. Я думаю, что проблема вызвана дублированием регистрации. Я добавил флаг, тогда проблема исправлена.

Пожалуйста, попробуйте это (я использую Objective-C, поэтому, пожалуйста, перепишите в быстром).

Реализовать категорию,

@interface UITableViewCell (FourceTouchRegistered) 

@property (nonatomic, assign) BOOL fourceTouchRegistered; 

@end 

и

#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 

затем

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

 Смежные вопросы

  • Нет связанных вопросов^_^