2017-05-01 22 views
0

右から左にスワイプすると、すでに2つのカスタムボタン(UITableViewRowActionの編集アクション)を実装しているセルを持つUITableViewがあります。すべてうまくいく。UITableViewCell右から左へスワイプ

Mail.appと同様に、ユーザーが「すべて」(右から左に)スワイプすると、ボタンの操作の1つをトリガーしたいと思います。

コードは、私が代わりに十分なコードであると信じるものを持っているiOSの9と10

ためスウィフト3、です。

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { 
    return .delete 
} 

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    print("commit editingStyle") 
} 

commit editingStyle機能は、私はそれが期待通り、発射したことがありません。

私はeditActionsForRowAtメソッドを削除しました。おそらく、カスタムボタンを定義しているうちに何かを悩ましていると思います。デフォルトの「削除」ボタンが表示されますが、commit editingStyleはまだ起動しません。

これは価値がありますが、これはUIViewController(UITableViewControllerではなく)内のUITableViewで、.dataSourceと.delegateの両方が問題のクラスに設定されています。また、NSFetchedResultsControllerDelegateです。

+0

Master/Detailテンプレートプロジェクト(Xcode 8.3.2)でもこれらのメソッドがあり、フルスワイプをサポートしていません。おそらく、右から左へのフルスワイピングが組み込まれていることを示唆している私が読んでいるものは、間違っています。 –

答えて

0

UISwipeGestureRecognizerを個々のセルではなくテーブル自体に関連付けます。スワイプが検出されたら、スワイプされたセルを計算し、それに応じてスワイプアクションを呼び出します。

+0

私はそれについて考えましたが、私はむしろ避けたい種類のハックのように感じます。私はこの目的のために 'commit editingStyle'が存在すると信じていますので、私はそれを働かせることを望んでいます。 –

0

これを追加します。

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return true 
} 
+0

すでに準備が整っています - 私は元の質問にそれを含めるべきでした。この関数は期待通りに呼び出されています。 (1回のスワイプで3回呼び出されます。これは価値があります)。 –

0

は私がハックのあまりだとは思わない、これを行うためのメカニズム、思い付いた - 確かに少ないので、私が見つけた他のソリューションよりも。コメントは大歓迎です。

私の意図は、常に可能な限り多くの標準機能を使用することです。私がやっていることは、ユーザーがセルの本体を左にどれだけスワイプしたかを追跡することです。スレッシュホールドに達すると、問題のボタンに対してeditActionsForRowAtから呼び出された同じアクションを実行するようにUITableViewに指示します。

私は、セルが左にどれだけ移動したかの閾値として-225を使用しています。これはすべての実装では機能しないかもしれません。私の場合、私は2つのカスタムアクションを持っています、1つのボタンは多少広いサイドにあります。

私が実際に追加するのは、.UITrackingRunLoopModeを使用してメイン実行ループに追加するNSTimerだけです。これは、ユーザーが指を動かしているとき(そしてそのときだけ)に実行する利点があります。タイマーが起動すると、セルがホストtableViewとの相対的な位置を確認します。追加されたビューはなく、ジェスチャ認識機能は追加されていません。カスタムUITableViewCellので

が、私はこの追加:のUITableViewのcellForRowAtIndexPathで

var trackTimer:Timer? = nil 
weak var tableView:StudentsLessonsViewController? = nil 

override func awakeFromNib() { 
    super.awakeFromNib() 
    setupTimer() 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 
    setupTimer() 
} 

func setupTimer() { 
    self.trackTimer = Timer.init(timeInterval: 0.1, target: self, selector: #selector(performActionIfScrolledFarEnough), userInfo: nil, repeats: true) 
    if let trackTimer = self.trackTimer { 
     RunLoop.main.add(trackTimer, forMode: .UITrackingRunLoopMode) 
    } 
} 

func performActionIfScrolledFarEnough() { 
    let globalPoint = self.superview?.convert(self.frame.origin, to: self.tableView?.tableView) 
    //print("globalPoint.x: \(String(describing: globalPoint?.x))") 
    if let globalPoint = globalPoint { 
     if globalPoint.x < CGFloat(-225) { 
      //print ("Perform Action NOW!!!") 
      trackTimer?.invalidate() 
      if let tableView = self.tableView { 
       tableView.primaryActionButtonPressed(cell: self) 
      } 
     } 
    } 
} 

を、私が追加:

cell?.tableView = self 

私はすでに、私はとき呼び出した、私のUITableViewでこの機能を持っていましたユーザーは、editActionsForRowAtで定義されたボタンの1つをタップする:

func tableView.primaryActionButtonPressed(cell:UITableViewCell) 

私のprimaryActionButtonPressed関数私はtableView(概念的には削除のような)からセルを削除します。違う動作で異なる実装の詳細が必要になる可能性があります。

関連する問題