2015-12-08 21 views
5

私はiPhoneの6のUITableViewControllerにいくつかのテスト3D Touch機能を追加しました。一般的には正常に動作しますが、いくつかの2つの問題を観察することができました。何が起きているのか、それをどのように修正するのかは分かりません。3DタッチとUITableViewCell

1)セルが選択可能なので、ユーザーはそれを押すか「3Dタッチ」を使用できます。問題は、「Pop」と「Peek」をUITableViewCellに使用すると選択され、通常の方法でsetSelected:またはsetHighlighted:のメソッドを使用して選択解除できないということです。 previewingContext:commitViewControllerpresentViewController完了でも、別の場所でそれを選択解除しようとしました。彼らは何もせず、細胞はまだ選択状態にとどまっています。私は選択されたセルを取り出しましたreviewingContext.sourceViewと私の選択したセルを与えた他の一時コードを呼び出して、これらのメソッドは動作しませんでした。

  • そこで質問は、ユーザーがそれに「ポップ」のプレスを適用し、セルの選択を解除する(またはより良い無しを選択する)通常の方法は何ですか?

2)また、私は時々、私はジェスチャーを「ポップ」とpreviewingContext:viewControllerForLocation方法がさえ呼び出されなかったとき(初期状態にセルを持参キャンセルする場合)私のUIだけでハングアップし、まったくタッチに反応しないことに気づきました。私はそれを動作させるために殺す必要があります。非常に奇妙に思えますが、私はこれをチェックしましたTutorial。それは言及された問題なしで素晴らしい作品が、彼らはセルにではなく、デリゲートを登録しますが、UITableViewで "ポップ"ジェスチャーは、tableView全体を強調表示しかし、セルではない。

  • ここで間違いがありますか?
  • ここ

は、私が事前に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) 
    } 

おかげに準拠して私のテストUITableViewControllerで3D touchを実装する方法です!

答えて

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を使っていますので、速やかに書き換えてください。

テーブルビューのセルに3Dタッチを追加するために、その後

if(cell.fourceTouchRegistered == NO) { 
     cell.fourceTouchRegistered = YES; 
     if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) { 
      [self registerForPreviewingWithDelegate:self sourceView:cell]; 
     } 
    } 
3
  • 簡単な方法

    @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 
    

    というカテゴリを実装します。1行のコードなし

storyboard image

関連する問題