J'ai une application qui a un bouton personnalisé dans une cellule personnalisée. Si vous sélectionnez la cellule, elle passe à une vue détaillée, ce qui est parfait. Si je sélectionne un bouton dans une cellule, le code ci-dessous imprime l'index de la cellule dans la console.
J'ai besoin d'accéder au contenu de la cellule sélectionnée (à l'aide du bouton) et de les ajouter à un tableau ou un dictionnaire. Je suis nouveau dans ce domaine et j'ai donc du mal à savoir comment accéder au contenu de la cellule. J'ai essayé d'utiliser didselectrowatindexpath, mais je ne sais pas comment forcer l'index à être celui de la balise ...
Donc, fondamentalement, s'il y a 3 cellules avec 'Dog', 'Cat', 'Bird' comme cell.repeatLabel.text dans chaque cellule et que je sélectionne les boutons dans les lignes 1 et 3 (Index 0 et 2), cela devrait ajoutez «Dog» et «Bird» au tableau / dictionnaire.
// MARK: - Table View
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return postsCollection.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell
// Configure the cell...
var currentRepeat = postsCollection[indexPath.row]
cell.repeatLabel?.text = currentRepeat.product
cell.repeatCount?.text = "Repeat: " + String(currentRepeat.currentrepeat) + " of " + String(currentRepeat.totalrepeat)
cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton
cell.checkButton.tag = indexPath.row;
cell.checkButton.addTarget(self, action: Selector("selectItem:"), forControlEvents: UIControlEvents.TouchUpInside)
return cell
}
func selectItem(sender:UIButton){
println("Selected item in row \(sender.tag)")
}
OPTION 1. Traitement avec délégation
La bonne façon de gérer les événements déclenchés à partir des sous-vues de votre cellule consiste à utiliser la délégation .
Vous pouvez donc suivre les étapes:
1. Au-dessus de votre définition de classe, écrivez un protocole avec une méthode d'instance unique dans votre cellule personnalisée:
protocol CustomCellDelegate {
func cellButtonTapped(cell: CustomCell)
}
2. Dans votre définition de classe, déclarez une variable de délégué et appelez la méthode de protocole sur le délégué:
var delegate: CustomCellDelegate?
@IBAction func buttonTapped(sender: AnyObject) {
delegate?.cellButtonTapped(self)
}
3. Conformez-vous à CustomCellDelegate dans la classe où se trouve votre vue de table:
class ViewController: CustomCellDelegate
4. Définissez le délégué de votre cellule
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell
cell.delegate = self
return cell
}
5. Implémentez la méthode requise dans votre classe de contrôleur de vue.
EDIT: Définissez d'abord un tableau vide, puis modifiez-le comme ceci:
private var selectedItems = [String]()
func cellButtonTapped(cell: CustomCell) {
let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)!
let selectedItem = items[indexPath.row]
if let selectedItemIndex = find(selectedItems, selectedItem) {
selectedItems.removeAtIndex(selectedItemIndex)
} else {
selectedItems.append(selectedItem)
}
}
où items est un tableau défini dans mon contrôleur de vue:
private let items = ["Dog", "Cat", "Elephant", "Fox", "Ant", "Dolphin", "Donkey", "Horse", "Frog", "Cow", "Goose", "Turtle", "Sheep"]
OPTION 2. Manipulation à l'aide de fermetures
J'ai décidé de revenir et de vous montrer une autre façon de gérer ce type de situations. L'utilisation d'une fermeture dans ce cas entraînera moins de code et vous atteindrez votre objectif.
1. Déclarez une variable de fermeture dans votre classe de cellule:
var tapped: ((CustomCell) -> Void)?
2. Appelez la fermeture à l'intérieur de votre gestionnaire de boutons.
@IBAction func buttonTapped(sender: AnyObject) {
tapped?(self)
}
3. Dans tableView(_:cellForRowAtIndexPath:)
la classe de contrôleur de vue conteneur:
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
cell.tapped = { [unowned self] (selectedCell) -> Void in
let path = tableView.indexPathForRowAtPoint(selectedCell.center)!
let selectedItem = self.items[path.row]
println("the selected item is \(selectedItem)")
}
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots