2016-07-11 16 views
0

Ich habe eine Tabellenansicht, die eine Liste von Elementen anzeigt, und jedes Mal, wenn eine Zeile ausgewählt wird, wird ein Häkchen hinzugefügt und eine bestimmte Menge wird zu var total hinzugefügt.Wählen Sie die Zeile einmal aus und führen Sie die Berechnung aus. Swift

Wenn eine andere Zeile ausgewählt ist, wird dasselbe Verhalten wie oben ausgeführt und der vorherige Betrag für die nicht ausgewählte Zeile wird abgezogen. Auch die nicht ausgewählte Zeile erhält kein Häkchen.

Das Problem ist, dass wenn eine Zeile mehrmals ausgewählt wird, wird der Betrag entsprechend der ausgewählten Zeile hinzugefügt.

Was ich will, ist, den Betrag, der der Zeile entspricht, nur einmal hinzuzufügen, unabhängig davon, wie oft die Zeile ausgewählt ist.

class EighthViewController: UIViewController, UITableViewDelegate,UITableViewDataSource { 

var total = 0 

struct Item { 
    var name:String // name of the row 
    var selected:Bool // whether is selected or not 
} 

var frequency = [ 

    Item(name:"Every week",selected: false), 
    Item(name:"Every 2 weeks",selected: false), 
    Item(name:"Every 4 weeks",selected: false), 
    Item(name:"Once",selected: false), 
    Item(name:"End of tenancy cleaning", selected: false) 
] 

@IBOutlet weak var tableView: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return frequency.count 
} 
func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

// configure the cell 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) 
    -> UITableViewCell  { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") 
     cell?.textLabel?.text = frequency[indexPath.row].name 
    return cell! 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .Checkmark 

    if indexPath.row == 0 { 
    self.total += 30 
     print(total) 

     } else if indexPath.row == 1 { 
     self.total += 30 
     print(total) 

     } else if indexPath.row == 2 { 
      self.total += 30 
      print(total) 

    } else if indexPath.row == 3 { 
     self.total += 40 
      print(total) 

    } else if indexPath.row == 4 { 
     self.total += 44 
      print(total) 
    } 
} 

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { 
    tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .None 

    if indexPath.row == 0 { 
     self.total -= 30 
     print(total) 

    } else if indexPath.row == 1 { 
      self.total -= 30 // delete previous amount 
      print(total) 


     } else if indexPath.row == 2 { 
      self.total -= 30 // delete previous amount 
      print(total) 


    } else if indexPath.row == 3 { 
     self.total -= 40 // delete previous amount 
     print(total) 

    } else if indexPath.row == 4 { 
     self.total -= 44 // delete previous amount 
     print(total) 
    } 

    } 
} 

Antwort

1

Sie haben eine Struktur mit der eine bool Eigenschaft erstellt selected so können Sie es sehr leicht zu vermeiden, dass die Menge in der Zelle mehrmals hinzugefügt wird, verwenden und Sie nicht die didDeselectRowAtIndexPath überhaupt verwenden müssen , um jedes Mal benachrichtigt werden, wenn eine Zelle angezapft wird, müssen Sie nur didSelectRowAtIndexPath Methode wie auf folgende Weise verwenden:

Aber für eine bessere Verwendung Ihrer Struktur empfehle ich, die Menge innerhalb des Typs einzuführen und der Code wäre sauberer wie auf diese Weise:

struct Item { 
    var name:String // name of the row 
    var selected:Bool // whether is selected or not 
    var amount: Int // value of the item 
} 

var frequency = [ 

    Item(name:"Every week",selected: false, amount: 30), 
    Item(name:"Every 2 weeks",selected: false, amount: 30), 
    Item(name:"Every 4 weeks",selected: false, , amount: 30), 
    Item(name:"Once",selected: false, amount: 40), 
    Item(name:"End of tenancy cleaning", selected: false, amount: 44) 
] 

Und wir brauchen die letzte Zelle für jedes Mal, wenn wir so klein Notwendigkeit, die neuen aktualisieren möchten angezapft speichern eine optionale Eigenschaft wie diese zu erstellen:

var indexPathForCellSelected: NSIndexPath? 

Und dann sollte der Code wie das sein folgende:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    if !frequency[indexPath.row].selected { 

     // this avoid set initial value for the first time 
     if let index = indexPathForCellSelected { 
      // clear the previous cell 
      frequency[index.row].selected = false 
      tableView.cellForRowAtIndexPath(index)?.accessoryType = .None 
      self.total -= frequency[index.row].amount 
     } 

     // mark the new one 
     frequency[indexPath.row].selected = true 
     tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .Checkmark 

     indexPathForCellSelected = indexPath 
     self.total += frequency[indexPath.row].amount 
    } 
} 

Ich hoffe, das hilft Ihnen.

+0

Danke für Ihre Hilfe. Es gibt einige Probleme mit dem von Ihnen bereitgestellten Code. In der ersten Version wird jedes Mal, wenn eine Zeile ausgewählt wird, der Betrag, der der Zeile entspricht, zu "total" addiert. Das Häkchen verschwindet nicht. Wenn in der zweiten Version mehrere Zeilen ausgewählt sind, wird der Betrag zu "total" addiert, wenn sie abgewählt werden, wird der Betrag abgezogen, aber die zuvor ausgewählte Zeile verliert nicht ihr Häkchen und der Betrag, der in einer neuen Zeile inkrementiert wurde ausgewählt. – bibscy

+0

Das Verhalten, das ich suche, ist: 1. Zeile auswählen -> Betrag hinzufügen, Häkchen hinzufügen. 1.1 Zeile erneut auswählen -> nichts passiert. 2.1. Wählen Sie eine andere Zeile aus, setzen Sie das Häkchen für die vorherige Zeile auf .Keine, ziehen Sie den zuvor hinzugefügten Betrag von der Summe ab, fügen Sie der neu ausgewählten Zeile ein Häkchen hinzu, und fügen Sie der ausgewählten Zeile einen Betrag hinzu. Danke – bibscy

+0

@bogdanbarbulescu Uhmm sehen aktualisierte Antwort, Ihre Frage war nicht sehr klar beim ersten Mal, jetzt ist es klar. Ich hoffe, das hilft Ihnen –

Verwandte Themen