2016-05-17 4 views
0

これはおそらくX Yの問題だと思うので、最初にいくつかの背景情報を示します。テーブルビューのセルをもっとエレガントに追加/削除するにはどうすればよいですか?

「フォーム」を表示できるアプリを構築しています。ユーザーはフォームにいくつかのものを記入してカスタムのものを作成できます。

フォームにテーブルビューを使用するのが最も適切なことだと思います。また、各表のセルには、入力が必要なすべてのテキストボックスを表示できます。

ここではスクリーンショットです:それがタップされたとき

enter image description here

「新しい入力を追加」ボタンは下部に新しい電池を挿入します。入力の1つを左にスワイプすると、「削除」ボタンが表示されます。これを使用して入力を削除できます。

ご覧のとおり、このテーブルビューでは行の追加と削除が必要です。

元々、私はこれを簡単にする "TableViewModel"と呼ばれるココアポッドを使用していました。しかし、私はa really severe bugをライブラリに見つけましたので、もう使用したくありません。

テーブルビューのdeleteRowsAtIndexPathsinsertRowsAtIndexPathsの方法を試しました。しかし、私はこのようにそれを行う場合:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = UITableViewCell() 
    cell.textLabel?.text = "Hello" 
    return cell 
} 

// I use motionEnded here because I don't want to add a button or anything just to test this 
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) { 
    tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: .Fade) 
} 

それは私が1行を削除した後、テーブルビューは、データソースと矛盾しているという例外が発生します。つまり、この不一致を処理するコードが必要です。これは間違いなく私のコードを読みにくくするでしょう。

同じことが挿入方法になります。

また、各セクションにある行の数を把握する必要があります。そして、私のコードはちょうど本当に面倒で、すべてのもので維持できなくなります。

私は他のライブラリも検索しましたが、それらはすべて "tableViewModel"と同じくらい奇妙で、あまり単純ではありません。それらはすべて、テーブルビューのモデルを作成する必要があります。私は私の場合にそれをする方法を理解していません。私はちょうどたくさんのテキストフィールドを表示したい!

行を挿入したり削除したりするにはどうすればよいですか?私は、テーブルビューのextensionを書くか、テーブルビューのモデルを書くことを学ぶ必要があると思います。しかし、私はどちらの方法も実行できません。

+0

データソースがないためです。論理的にも参照してください。insertRowsAtIndexPathsで新しい行を追加するとします。今は2行あります。ただし、numberOfRowsInSectionは常に1を返します。したがって、クラッシュし、その逆もあります。テーブルビューは、コレクション(NSArray、NSDictionary、NSSetなど)で動作するはずです。 – Alok

+0

問題は、行を追加または削除すると、セクション内に1行しかないということです。配列やディクショナリを使用して、各行と各セクションのデータ(とデータ)の数を追跡し、その値を 'numberOfSectionsInTableView:'と 'tableView:' numberOfRowsInSection: 'に返します。 – Larme

+0

テーブルビューを使用してこの種のフォームを実行しないでください。それから私は何をすることができますか? @Alok – Sweeper

答えて

0

解決策が見つかりました。

var cells: [[UITableViewCell]] = [[], [], []] // I have 3 sections, so 3 empty arrays 

そしてIは、これらのデータ・ソース・メソッド追加:

Iは基本的に表示するには、表ビューのセルのアレイのアレイを保つ今

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return cells.count 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return cells[section].count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    return cells[indexPath.section][indexPath.row] 
} 

を、私が追加することができ、およびスーパーセルを簡単に削除します。

func addCellToSection(section: Int, index: Int, cell: UITableViewCell) { 
    cells[section].insert(cell, atIndex: index) 
    tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: section)], withRowAnimation: .Left) 
} 

func removeCellFromSection(section: Int, index: Int) { 
    cells[section].removeAtIndex(index) 
    tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: section)], withRowAnimation: .Left) 
} 

アニメーションでセルを追加/削除できます。

0

data sourceはありません。 logicallyも参照してください。insertRowsAtIndexPathsで新しい行を追加するとします。今は2 rowsです。しかし、あなたのnumberOfRowsInSectionは常に1を返します。したがって、クラッシュし、その逆もあります。テーブルビューはcollectionNSArray,,NSSetなど)で動作するはずです。あなたの助けのために :

Already they have nade a form as yours

obj-c easy to understand how table view with data source work

Adding, Updating, Deleting and Moving records using Swift.

0

フォームを作成するためにTableViewを使用することができますが、これらのデータを追跡するために、適切なデータソースを設計する必要があります。削除操作が行われたとき

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    if editingStyle == .Delete { 
     //Delete the row from the data source to ensure consistency 
     self.array.removeAtIndex(indexPath.row) 
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
    } 
} 

あなたはdataSourceとしてモデルクラスを使用することができ、次のように今のdataSource方法は、あなたがこのデータソースを編集することができる

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return yourDataSourceForSection.count 
} 

に変更する必要があります。

class NewCustomOperation: NSObject { 
    var name: String? 
    var rejectFloatingPoints: Bool? 
    var inputs: AvailableInputs? 
    var results: Results? 
} 

class AvailableInputs: NSObject { 
    var name: [String]? 
    var description: [String]? 
} 

class Results: NSObject { 
    var name: [String]? 
    var formula: [String]? 
} 
+0

はい私はそれを知っていますが、表示するデータの束ではなく、ユーザーが入力するテキストフィールドがたくさんある場合、データソースはどうなりますか? – Sweeper

+0

スタックビューの使用を検討しましたか?おそらく多くの仕事がありますが、彼らはあなたのためのインターフェイスをスムーズに管理します。 – user3069232

+0

@ user3069232でも、私はiOS8を使っていますが、スタックビューは利用できないと思います。 – Sweeper

関連する問題