2017-05-02 12 views
1

TableViewDataSourceからセルを削除するか、追加します。セットアップ

私は、テーブルビューのデリゲートとして機能標準TableViewController.swiftを持っており、データソースとして機能しますTableViewDataSource.swift呼ば別のファイル。

テーブルビューの上部には、セル内に一連のボタンがあり、クローズアクションがあります。このセクションの目標は、ユーザーが却下する可能性のある通知として機能することです。

各ボタンのタグはindexPath.rowです。

問題は、私の問題はこれです。ユーザーが「x」ボタンをタップすると、このセルの削除をアニメートしたいと思います。これはこれで処理されます:上記のようにボタン機能tappedOnExitがある、私のdataSourceであるため、

しかし
func tappedOnExit(_ sender: UIButton) { 
    print ("tapped on \(sender.tag)") 

} 

は、正式に行を削除するために、私は、

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)

を呼び出す必要があります別ファイル私のviewControllerからself.tableView. deleteRowsAtIndexPaths

のようなものを呼び出すことができません。ありがとう!

答えて

1

viewcontrollerファイルにオブザーバー(通知センター)を追加する必要があります。

「x」をクリックすると、データソースファイルからポスト通知を呼び出すことができます。

NSNotificationCenter.defaultCenter()postNotificationName(deleteRowを、オブジェクト:indexPath.row)。

+1

これは間違いなく、私の' delegate'と 'dataSource'の間の通信に使用できる方向です。これをデフォルトのtableViewメソッドを使って有機的に行う方法がもうない場合は、おそらくこれを行うでしょう。 – daspianist

+0

"x"の送信者であれば、superviewを見つけることができ、そこからtableviewのメソッドを呼び出すことができます –

-1

自分でcommitEditingStyleに電話をしないと、TableViewはその方法を送信します。 deleteRowAtIndexPathと電話するだけです。https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/TableView_iPhone/ManageInsertDeleteRow/ManageInsertDeleteRow.html

+0

ありがとう:以下のリソースからの委任をチェックしてください。私の問題は、私の 'dataSource'が別のファイルであるため、' self.tableView.delete ... 'のようなものにアクセスできません。実際、' self 'にアクセスすることはできません。tableView' – daspianist

+0

TableViewControllerでデータソースを作成していますか?もしそうなら、参照を渡してそのまま渡します。 – PeejWeej

+0

私の 'TableViewController'に' dataSource'を参照しています。しかし、私はまだ私のボタンロジック 'cellForRow indexPath'を登録します。どんな勧告も感謝しています。 (また、downvoteしなかった) – daspianist

1

間違った場所にヒットしたことを察知しているようです。データソースは、テーブルビューの背後にあるモデルへの非常に単純なインターフェイスでなければなりません。どの細胞がタップされているか、いつどのようなことが起こっているかは関係していません。

あなたのUIButtonは、データソースではなく、テーブルビュー自体にクリックを委任しているはずです。テーブルビューは、どの行が閉じられたのかを判断し、その行を削除します。

+0

ありがとうScott。これはおそらく私が現在行っていることに対するよりよいアプローチだと思います。私は、 'dataSource'ではなく、' delegate'のボタンタップをどのように扱うことができるか、心配する必要はありません。現在、ボタンのターゲットは 'cellForRow indexPath'(' dataSource'にあります)に登録されています。この方法ではなく、どこでお勧めしますか? – daspianist

+0

完全なメソッドシグネチャは 'tableView:cellForRowAtIndexPath'です。おそらくその呼び出しでは' tableView'を持っていますか?その場合、作成されたセルのUIボタンのターゲットを 'closeButtonHit'のようなアクションでtableViewに設定することができます。そのメソッドのトリックは、テーブルビューのセルを実行し、送信者と一致するボタンを見つけることによって閉じるボタンが当たったセルを見つけることです。 –

+0

私たちは同じページにいます。これが 'tableView:cellForRowAtIndexPath'で行ったことです。私は、 'cell.exitButton.tag = indexPath.row'を実行することで' indexPath.row'と同じタグを持つボタンを登録しました。(2) 'cell.exitButton.addTarget(self、action :#select(tappedOnExit(_ :)):.touchUpInside) 'あなたが言及したように、これの欠点は私のクリックロジックが私の' dataSource'の中にあることです。そして、それを得るために通知を使うような何かをする必要があります私の 'delegate'へ – daspianist