2015-03-31 29 views
6

Ich habe eine UITableView mit mehreren Abschnitten und in meiner CellForRowAtIndexPath-Methode füge ich einen UITapGestureRecognizer der Zelle ImageView (jede Zelle hat ein kleines Bild). Ich habe Zugriff auf das Bild erfolgreich (um es zu ändern) unter Verwendung von:Abrufen von UITableViewCell von UITapGestureRecognizer

var imageView : UIImageView! = sender.view! as UIImageView 

Was ich jetzt tun müssen, ist jedoch die Daten der Zelle zugreifen, die ich glaube, bedeutet, dass ich müssen in der Lage sein Greifen Sie auf die Zelle zu, um die Abschnittsnummer und die Zeilennummer zu erhalten. Kann jemand beraten, wie man das macht? Die Idee ist, dass ich das Bild in ein ungeprüftes Kontrollkästchen ändere, wenn die Aufgabe erledigt ist, aber dann muss ich diese Aufgabe in meinen Daten als erledigt markieren.

Antwort

17

In Ihrer Funktion, die den Hahn Gestenerkenner Griffe, verwenden tableView ‚s indexPathForRowAtPoint Funktion zu erhalten und optionalen Index-Pfad Ihres Touch-Ereignis wie folgt:

func handleTap(sender: UITapGestureRecognizer) { 
    let touch = sender.locationInView(tableView) 
    if let indexPath = tableView.indexPathForRowAtPoint(touch) { 
     // Access the image or the cell at this index path 
    } 
} 

Von hier aus können Sie cellForRowAtIndexPath nennen zu bekommen Zelle oder eines seiner Inhalte, wie Sie jetzt den Indexpfad der angezapften Zelle haben.

+0

Hallo, das hat fast funktioniert! Der Standort muss jedoch falsch sein, da er Vorgänge für die falschen Zellen ausführt. Irgendwelche Gedanken dazu? – iOSBeginner

4

Sie die Position des Bildes, um geklopft bekommen die indexPath zu finden und von dort in die Zelle finden, die dieses Bild hat:

var position: CGPoint = sender.locationInView(self.tableView) 
var indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(position)!  
var cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath) 
+0

Hallo, das hat fast funktioniert! Der Standort muss jedoch falsch sein, da er Vorgänge für die falschen Zellen ausführt. Irgendwelche Gedanken dazu? – iOSBeginner

+1

Sollte sein: var cell = self.tableView.cellForRowAtIndexPath (indexPath) – Josh

2

Sie verpassen, dass Sie hier das Delegate-Entwurfsmuster verwenden können .

ein Protokoll erstellen, das den Teilnehmern die Zustandsänderungen in der Checkbox (Imageview) sagt:

enum CheckboxState: Int { 
    case .Checked = 1 
    case .Unchecked = 0 
} 

protocol MyTableViewCellDelegate { 
    func tableViewCell(tableViewCell: MyTableViewCell, didChangeCheckboxToState state: CheckboxState) 
} 

Und vorausgesetzt, Sie haben eine UITableViewCell Unterklasse:

class MyTableViewCell: UITableViewCell { 

    var delegate: MyTableViewCellDelegate? 

    func viewDidLoad() { 

     // Other setup here... 

     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "didTapImage:") 
     imageView.addGestureRecognizer(tapGestureRecognizer) 
     imageView.userInteractionEnabled = true 
    } 

    func didTapImage(sender: AnyObject) { 

     // Set checked/unchecked state here 
     var newState: CheckboxState = .Checked // depends on whether the image shows checked or unchecked 

     // You pass in self as the tableViewCell so we can access it in the delegate method 
     delegate?.tableViewCell(self, didChangeCheckboxToState: newState) 
    } 

} 

Und in Ihrer UITableViewController Unterklasse:

class MyTableViewController: UITableViewController, MyTableViewCellDelegate { 

    // Other methods here (viewDidLoad, viewDidAppear, etc)... 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) { 
     var cell = tableView.dequeueReusableCellWithIdentifier("YourIdentifier", forIndexPath: indexPath) as MyTableViewCell 

     // Other cell setup here... 

     // Assign this view controller as our MyTableViewCellDelegate 
     cell.delegate = self 

     return cell 
    } 

    override func tableViewCell(tableViewCell: MyTableViewCell, didChangeCheckboxToState state: CheckboxState) { 

     // You can now access your table view cell here as tableViewCell 

    } 

} 

Hoffe, das hilft!

+1

'UITableViewCell' kein' viewDidLoad' Methode –

+0

Verwendung awakeFromNib statt viewDidLoad hat – djdance

Verwandte Themen