2015-03-31 7 views
6

Birden çok bölüm içeren bir UITableView'ım var ve cellForRowAtIndexPath yöntemimde hücrenin imageView'üne bir UITapGestureRecognizer ekliyorum (her hücrenin küçük bir resmi var). Ben kullanarak (sırayla değiştirmek için de) bu görüntüyü erişen başarılı olmuştur: Şimdi yapmanız gerekenUITapGestureRecognizer'dan UITableViewCell'i alma

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

Ancak ben edebilmek için gerektiği anlamına inanıyoruz hücrenin verileri erişmek olduğunu bölümü ve satır numarasını almak için hücreye erişin. Bunun nasıl yapılacağı konusunda tavsiyede bulunabilir mi? Buradaki fikir, eğer görev tamamlanırsa, görüntüyü işaretlenmemiş bir onay kutusuna değiştirdiğim, ancak verilerimde aslında bu görevi tamamlandı olarak işaretlemem gerekiyor.

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

Buradan elde etmeyi cellForRowAtIndexPath çağırabilirsiniz: vurma hareketi tanıyıcı kolları senin fonksiyonunda

cevap

17

, edinme ve dokunmatik olayın opsiyonel indeks yolu şöyle etmek tableView 'ın indexPathForRowAtPoint işlevini kullanın hücrenin veya içeriğinin herhangi biri, artık dokunulan hücrenin dizin yoluna sahip.

O imajı vardır hücreyi bulmak indexPath bulmak için oradan aday görüntünün konumunu alabilirsiniz
+0

Merhaba, bu neredeyse işe yaradı! Ancak, yanlış hücreler üzerinde işlem gerçekleştirirken konum yanlış olmalıdır. Bu konuda bir fikrin var mı? – iOSBeginner

4

:

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

Merhaba, bu neredeyse işe yaradı! Ancak, yanlış hücreler üzerinde işlem gerçekleştirirken konum yanlış olmalıdır. Bu konuda bir fikrin var mı? – iOSBeginner

+1

Olması gereken: var cell = self.tableView.cellForRowAtIndexPath (indexPath) – Josh

2

Sen burada Delege tasarım deseni kullanabilmesi kaçırıyorsun .

sizin onay kutusunu delegelere durum değişikliklerini anlatıyor bir protokol (ImageView) oluşturun:

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

} 

Ve UITableViewController alt sınıfta:

Bir UITableViewCell alt sınıfı olduğunu varsayarak

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

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

Ve

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 

    } 

} 

Bu yardımcı olur umarız!

+1

: UITableViewCell'de 'viewDidLoad' yöntemi yok –

+0

awakeFromNib yerine viewDidLoad kullanılıyor – djdance