2016-07-08 11 views
0

私はビューコントローラでテーブルビューを持っていますが、達成したいのは、行が選択されて減算された場合に行1 ... 4に対して5をvar mytotalに追加することです行が選択解除されている場合は5です。 5行目(最後)のためチェックマークを追加/削除して金額を追加する

Iは、行が選択された場合に10を追加して、行が選択解除された場合に10を減算します。 行が選択されるたびに、セルの右側にチェックマークが追加され、行が選択解除されるとチェックマークが削除されます。

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

@IBOutlet weak var mytotal: UILabel! 
var total = 0 
@IBOutlet weak var tableView: UITableView! 

var items = ["Inside Cabinets", "Inside Fridge", "Inside Oven", "Interior windows","Laundry wash & dry"] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "myCell") 


} 

// number of rows in table 
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { 
    return self.items.count 
} 

    // create the cells 
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { 

    var cell = self.tableView.dequeueReusableCellWithIdentifier("myCell")! 
    cell.textLabel!.text = self.items[indexPath.row] 
    cell.accessoryType = UITableViewCellAccessoryType.None 
    return cell 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    var theCell = tableView.cellForRowAtIndexPath(indexPath)! 


    if theCell.accessoryType == .None { 
     theCell.accessoryType = .Checkmark 
     total += 5 
    self.mytotal.text = String(total) 
    } 
    else if theCell.accessoryType == .Checkmark { 
     theCell.accessoryType = .None 

     total -= 5 
    self.mytotal.text = String(total) 
    } 

} 


} 

答えて

0

私はあなたの記述を達成するためにコードを少し変更しました。

まず、Stringの配列を単純に作成する代わりに、構造体を作成してそこに各要素のデータを格納することができます。

struct Item { 
    var name: String // Name of the row (e.g. "Inside cabinets") 
    var isSelected: Bool // Whether or now this item has been selected 
    var value: Int // How much you increase your total when selecting this row 
} 

は、その後、次のようにあなたのビューコントローラでは、あなたが[Item]のあなたの配列を定義します:あなたのtableView:cellForRowAtIndexPath方法で細胞をデキューすると

var items = [ 
    Item(name: "Inside Cabinets", isSelected: false, value: 5), 
    Item(name: "Inside Fridge", isSelected: false, value: 5), 
    Item(name: "Inside Oven", isSelected: false, value: 5), 
    Item(name: "Interior windows", isSelected: false, value: 5), 
    Item(name: "Laundry wash & dry", isSelected: false, value: 10) 
    ] 

を、あなたがデキュー細胞はあなたのリストならば再利用しようとしていますアイテムの長さが十分に長くなる。したがって、セルのチェックやチェックを外すときは注意が必要です。セルが画面からスクロールするとすぐに、チェックされた状態または選択されていない状態が失われます。さらに、デキューされた新しいセルは、セルが再利用されたために予期しない選択が行われる可能性があります。 items配列もisSelected状態を保持している理由です

。この値を使用して、セルがデキューされて画面に表示されるときに、その行が以前に選択されたかどうかを判断します。

したがって、行を選択すると、データモデル([Item])が更新され、tableViewにそのindexPathでセルをリロードするように指示されます。 tableView.reloadData()を使用することもできますが、目に見えるすべてのセルを再読み込みするため、コストがかかります。選択/非選択セルのリロード

tableView:numberOfRowsInSectionを呼び出して、変更されたデータ・モデル(itemsアレイ)を使用してのtableView内のその行が更新され、細胞は、その後、オンまたはオフに表示されます。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    tableView.deselectRowAtIndexPath(indexPath, animated: true) 

    // Remove the following line. This will create a NEW cell. It is not the same cell that is visible currently on the screen. 
    // var theCell = tableView.cellForRowAtIndexPath(indexPath)! 

    // Toggle the selected state of this cell (e.g. if it was selected, it will be deselected) 
    items[indexPath.row].isSelected = !items[indexPath.row].isSelected 

    // Update your stored total based on the value of this item 
    if items[indexPath.row].isSelected { 
     total = total + items[indexPath.row].value 
     self.mytotal.text = String(total) 
    } else { 
     total = total - items[indexPath.row].value 
     self.mytotal.text = String(total) 
    } 

    // Tell the table to reload the cell that has changed 
    tableView.beginUpdates() 
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None) 
    tableView.endUpdates() 
    } 

は、各項目の+/- 5及び+/- 10値は、データ・モデル内に記憶されています。そうすれば、値が異なる将来のアイテムを作成する場合は、配列をitemsに追加し、アイテムのvalue変数を設定するだけです。

他にもう1つ。選択時に細胞が暗くならないようにするには、メソッドにcell.selectionStyle = .Noneという行を追加します。

希望に役立ちます!

アップデート1:

私は上記の回答でisSelectedするselectedを修正しました。入力ミスを申し訳ありません。セルがtableView:cellForRowAtIndexPathでチェックされたか否かを示す含めることを忘れないでください:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = self.tableView.dequeueReusableCellWithIdentifier("myCell")! 
    cell.textLabel!.text = self.items[indexPath.row].name // Get name 

    // When the the cell scrolls back on screen, you will need to make sure it is checked if this cell was selected before going off the screen, 
    // and you need to remove the checkmark on a cell if it is being reused 
    if items[indexPath.row].isSelected { 
     cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
    } else { 
     cell.accessoryType = UITableViewCellAccessoryType.None 
    } 

    cell.selectionStyle = .None 

    return cell 
    } 
+0

このコードの問題のカップルがあります。 isSelected値を持つ 'Item'のインスタンスは、' struct Item'で定義されていないので作成できません。 'struct item'を値' isSelected:Bool'で更新すると、 'items'配列の各項目は' isSelected'を保持する必要があります。私のコードは次のとおりです:https://gist.github.com/bibscy/fb394bbec379ae3950a2671ed1d9d2e1。ありがとう – bibscy

+0

私は今、 'var isSelected:Bool'を' struct Item'に追加し、 'var items'に' isSelected:false'を加えました。しかし、今、いくつかの問題があります。最初にアプリケーションを実行して行をクリックすると、チェックマークは表示されません。その後、行を2回クリックしても、減算する代わりに 'total'に' value'を加え続け、チェックマークが消えないようにします。 https://gist.github.com/bibscy/059b2037ba81dd95680742a60b991aa2 – bibscy

+0

isSelectedに混乱して申し訳ありません。 Items構造体には、選択されていない "isSelected"のみが含まれている必要があります。私は私の答えを書いていたので、誤って変数名を変更しました。 Item構造体に3つのメンバー(name、isSelected、およびvalue)しかないようにコードを更新し、tableView:didSelectRowAtIndexPathコードでisSelectedを更新していることを確認してください。この行はおそらく原因です: 'items [indexPath.row] .isSelected =!items [indexPath.row] .selected'。 'selected'を 'isSelected'に変更します。また、行ラベルを設定するコードを忘れないでください。更新された回答を確認してください。 – Undrea

関連する問題