2015-03-31 2 views
6

У меня есть UITableView с несколькими разделами, а в моем методе cellForRowAtIndexPath я добавляю UITapGestureRecognizer к imageView ячейки (каждая ячейка имеет небольшое изображение). Я был успешным в доступе этого изображения (для того, чтобы изменить его) с помощью:Получение UITableViewCell от UITapGestureRecognizer

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

Что мне нужно сделать сейчас, однако, доступ к данным ячейки, которые я считаю, значит, я должен быть в состоянии доступ к ячейке, чтобы получить номер раздела и номера строки. Может ли кто-нибудь посоветовать, как это сделать? Идея заключается в том, что я изменяю изображение на флажок без отметки, если задача выполнена, но тогда в моих данных мне нужно пометить эту задачу как выполненную.

ответ

17

В функции, которая обрабатывает водопроводная жест распознаватель, используйте indexPathForRowAtPoint функцию tableView «ы получить и дополнительный индекс путь вашего сенсорного события так:

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 
    } 
} 

Отсюда вы можете позвонить cellForRowAtIndexPath получить ячейку или любое ее содержимое, так как теперь у вас есть путь указателя к удаленной ячейке.

+0

Привет, это почти сработало! Однако местоположение должно быть неправильным, поскольку оно выполняет операции с неправильными ячейками. Любые мысли по этому поводу? – iOSBeginner

4

Вы можете получить позицию изображения повернутого для того, чтобы найти indexPath и оттуда найти ячейку, которая имеет этот образ:

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

Привет, это почти сработало! Однако местоположение должно быть неправильным, поскольку оно выполняет операции с неправильными ячейками. Любые мысли по этому поводу? – iOSBeginner

+1

Должно быть: var cell = self.tableView.cellForRowAtIndexPath (indexPath) – Josh

2

Вы отсутствующий, что вы можете использовать шаблон проектирования Делегат здесь ,

Создать протокол, который говорит делегатам изменения состояния в вашем флажком (ImageView):

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

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

И если у вас есть на UITableViewCell подкласса:

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) 
    } 

} 

И в вашем UITableViewController подкласса:

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 

    } 

} 

Надеюсь, это поможет!

+1

'UITableViewCell' не имеет метода' viewDidLoad' –

+0

использовать awakeFromNib вместо viewDidLoad – djdance