2016-09-26 1 views
0

J'ai actuellement un ViewController avec un TableView à l'intérieur appelé SelectedListItemsViewController. Ce ViewControllerTableView est rempli par une classe de cellule personnalisée appelée SelectedListItemsTableViewCell.Comment utiliser UIStepper pour modifier une propriété dans un objet de modèle de domaine?

J'ai un tableau d'objets de modèle de domaine appelé selectedListItems, dont chacun a plusieurs propriétés. Le SelectedListItemsTableViewCell remplit le TableView avec la propriété listItem de cet objet indexPath.row, et chaque ligne a un UIStepper avec un UILabel à côté de lui (pour l'instant) montre UIStepper.value pour chaque ligne. Idéalement, l'étiquette reflétera la propriété listItemWeight de chaque ligne et la modifiera en incrémentant ou décrémentant cette ligne.

C'est ma cellule personnalisée:

class SelectedListItemsTableViewCell: UITableViewCell { 

    @IBOutlet var selectedListItemLabel: UILabel! 
    @IBOutlet weak var listItemWeightLabel: UILabel! 
    @IBOutlet weak var stepperControl: UIStepper! 

    @IBAction func stepperValueChanged(sender: UIStepper) { 

     listItemWeightLabel.text = Int(sender.value).description 

    } 
} 

Et dans mes ViewController « s cellForRowAtIndexPath, j'ai configuré la cellule comme ceci:

// Configure the cell... 
    cell.selectedListItemLabel.text = selectedListItems[indexPath.row].listItem 

    cell.listItemWeightLabel.text = "\(selectedListItems[indexPath.row].listItemWeight)" 

qui charge parfaitement la propriété listItem et la listItemWeight propriété s'affiche correctement, mais dès que j'augmente ou décrémente sur le UIStepper il est foiré. Comment associer correctement mon UILabel et UIStepper au [indexPath.row].listItemWeight?

Répondre

0

La réponse ci-dessus a été utile pour me conduire à la solution réelle de ma question, mais si quelqu'un dans le futur est curieux - je fini par utiliser une fermeture.

Dans ma classe de cellule personnalisé, je ne

@IBAction func stepperValueChanged(sender: UIStepper) { 

    selectedListItemLabel.text = Int(sender.value).description 
    tapped?(self) 

} 

Et dans mon contrôleur de vue, je ne

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! SelectedListItemsTableViewCell 

    cell.stepperControl.value = selectedListItems[indexPath.row].listItemWeight 

    // Configure the cell... 

    cell.tapped = { (selectedCell) -> Void in 

     selectedListItems[indexPath.row].listItemWeight = cell.stepperControl.value 

    } 

Ce qui m'a permis d'accéder UIStepper de chaque cellule dans le fichier du contrôleur de vue.

Il a aidé à lire la réponse de l'option 2 de flashadvanced dans this thread.

0

Dans la même méthode qui est appelée lorsque votre moteur pas à pas met à jour, mettez à jour votre listItem. Toutefois, comme cet élément est stocké dans votre base de données Realm, vous devez obtenir une instance de votre base de données Realm et écrire la modification dans la base de données.

Vous pouvez le faire en demandant à votre TableViewCell de conserver une instance de l'élément listItem. Votre nouvelle classe TableViewCell ressemblera à quelque chose comme ceci:

class SelectedListItemsTableViewCell: UITableViewCell { 

    @IBOutlet var selectedListItemLabel: UILabel! 
    @IBOutlet weak var listItemWeightLabel: UILabel! 
    @IBOutlet weak var stepperControl: UIStepper! 

    var listItem: Item? 

    @IBAction func stepperValueChanged(sender: UIStepper) { 
     listItemWeightLabel.text = Int(sender.value).description 
     if let listItem = listItem { 
      let realm = try! Realm 
      try! realm.write { 
       listItem.listItemWeight = Int(sender.value) ?? 0 
      } 
     } 
    } 
} 
+0

Merci pour la contribution, Nathan! Je ne suis pas capable de mettre à jour listItem dans la méthode où UIStepper met à jour (stepperValueChanged) puisque, pour autant que je sache (même si cela ne dit pas grand chose depuis que je suis très débutant en programmation), il faut un indexPath.row pour accéder propriétés de cet objet particulier, que je n'ai pas dans la classe de cellule personnalisée. Ai-je tort sur ce front? Chaque fois que j'essaie d'explorer les propriétés de selectedListItems, j'obtiens l'avertissement "Value of type '[RealmListItem]' n'a pas de membre 'listItemWeight'" – MachTurtle

+0

si votre 'SelectedListItemsTableViewCell' a une référence à l'élément listItem (de ce tableau) vous devriez être capable de le mettre à jour. –

+0

Excuses s'il s'agit d'une question horriblement naïve, mais comment pourrais-je faire référence à mon tableau (c'est global) de mon 'SelectedListItemsTableViewCell' d'une telle manière que je pourrais mettre à jour l'objet dans les propriétés de cette rangée? J'ai cherché autour pendant les 20 dernières minutes mais Google interprète «référence» d'une manière différente que nous entendons ici. – MachTurtle