2015-03-31 18 views
6

Tôi có một UITableView với nhiều phần và trong phương thức cellForRowAtIndexPath của tôi, tôi thêm một UITapGestureRecognizer vào imageView của ô (mỗi ô có một hình ảnh nhỏ). Tôi đã thành công trong việc tiếp cận hình ảnh đó (theo thứ tự để thay đổi nó) bằng cách sử dụng:Nhận UITableViewCell từ UITapGestureRecognizer

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

Những gì tôi cần phải làm gì bây giờ, tuy nhiên, là truy cập dữ liệu của tế bào, mà tôi tin có nghĩa là tôi cần để có thể truy cập vào ô để lấy số phần và hàng. Bất cứ ai có thể tư vấn về cách làm điều này? Ý tưởng là tôi đang thay đổi hình ảnh thành một hộp kiểm được bỏ chọn nếu nhiệm vụ được thực hiện, nhưng sau đó trong dữ liệu của tôi, tôi cần đánh dấu công việc đó là xong.

Trả lời

17

Trong chức năng của bạn để xử lý các recognizer tap cử chỉ, sử dụng tableView 's indexPathForRowAtPoint chức năng để có được và con đường chỉ số tùy chọn của sự kiện liên lạc của bạn như vậy:

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

Từ đây, bạn có thể gọi cellForRowAtIndexPath để có được hoặc bất kỳ nội dung nào của nó, vì bây giờ bạn có đường dẫn chỉ mục của ô được khai thác.

+0

Xin chào, điều này gần như đã hiệu quả! Tuy nhiên, vị trí phải không chính xác vì nó đang thực hiện các hoạt động trên các ô sai. Bất kỳ suy nghĩ về điều này? – iOSBeginner

4

Bạn có thể có được vị trí của hình ảnh khai thác để tìm các indexPath và từ đó tìm ra tế bào có hình ảnh đó:

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

Xin chào, điều này gần như đã hoạt động! Tuy nhiên, vị trí phải không chính xác vì nó đang thực hiện các hoạt động trên các ô sai. Bất kỳ suy nghĩ về điều này? – iOSBeginner

+1

nên là: var cell = self.tableView.cellForRowAtIndexPath (indexPath) – Josh

2

Bạn đang thiếu mà bạn có thể sử dụng các mẫu thiết kế Đại biểu ở đây .

Tạo một giao thức mà nói với các đại biểu những thay đổi trạng thái trong hộp kiểm của bạn (IMAGExem):

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

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

Và giả sử bạn có một lớp con 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) 
    } 

} 

Và trong UITableViewController phân lớp của bạn:

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 

    } 

} 

Hy vọng điều này sẽ hữu ích!

+1

'UITableViewCell' không có một' viewDidLoad' phương pháp –

+0

sử dụng awakeFromNib thay vì viewDidLoad – djdance

Các vấn đề liên quan