2016-10-05 1 views
0

Ich habe benutzerdefinierte TableViewCells in meiner TableView. Sie haben 2 oder mehr ImageViews innerhalb der Zelle, die berührt werden können und dann springen und ausgewählt werden. Aber woher weiß ich, welche ImageView in welcher Zeile ausgewählt wurde, da die Zellen wiederverwendet werden? Ich weiß, dass ich den indexPath.row bekommen kann, aber woher weiß ich, welches der 2 oder 3 Bilder die Funktion ausgelöst hat, um mir den indexPath zu geben? Ich hoffe, ihr versteht was ich meine. Hier ist meine benutzerdefinierte TableViewCell, der TableView-Code ist nur ein bisschen Standard.Wie kann man wissen, welches Bild in welcher Tabellenansichtszelle berührt wurde?

import UIKit 

class TwoPicsTableViewCell: UITableViewCell { 

@IBOutlet var containerView: UIView! 
@IBOutlet var votesButton: UIButton! 
@IBOutlet var commentsButton: UIButton! 
@IBOutlet var firstImage: bouncingRoundImageView! 
@IBOutlet var secondImage: bouncingRoundImageView! 
@IBOutlet var titleLabel: UILabel! 
@IBOutlet var descriptionLabel: UILabel! 
@IBOutlet var topUsernameLabel: UILabel! 
@IBOutlet var bottomUsernameLabel: UILabel! 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
    //self.layoutIfNeeded() 
    containerView.layer.cornerRadius = 10 
    containerView.clipsToBounds = true 
    self.backgroundColor = ColorScheme.primaryColor 
    votesButton.setTitleColor(ColorScheme.fourthColor, for: UIControlState()) 
    commentsButton.setTitleColor(ColorScheme.fourthColor, for: UIControlState()) 

    setupBackgroundGradient() 
    setupFirstImage() 
    setupSecondImage() 
} 

func setupBackgroundGradient() { 

    let bottomColor = ColorScheme.secondaryColor.cgColor 
    let topColor = ColorScheme.thirdColor.cgColor 

    let layer = CAGradientLayer() 
    layer.frame = containerView.frame 
    layer.frame.offsetBy(dx: -10,dy:-10) 
    layer.frame.size.width += 10 
    layer.frame.size.height += 10 
    layer.colors = [topColor, bottomColor] 

    containerView.layer.insertSublayer(layer, at: 0) 

} 

func setupFirstImage() { 

    let tappedOne = UITapGestureRecognizer(target: self, action: #selector(checkPicTwo)) 
    firstImage.addGestureRecognizer(tappedOne) 
} 

func setupSecondImage() { 

    let tappedTwo = UITapGestureRecognizer(target: self, action: #selector(checkPicOne)) 
    secondImage.addGestureRecognizer(tappedTwo) 
} 

func checkPicTwo() { 

    firstImage.bouncing() 
    vote(voteForPic: firstImage) 

    if secondImage.layer.borderWidth != 0 { 
     secondImage.layer.borderWidth = 0 
    } 
} 

func checkPicOne() { 

    secondImage.bouncing() 

    if firstImage.layer.borderWidth != 0 { 
     firstImage.layer.borderWidth = 0 
    } 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 
    firstImage.image = nil 
    secondImage.image = nil 
    firstImage.layer.borderWidth = 0 
    secondImage.layer.borderWidth = 0 
} 

} 
+0

Sie bereits tippen Gesten auf jedem Bild Ansicht haben, können Sie jetzt wissen, welches Bild berührt wird. Was ist das Problem? –

+0

wahr, aber die Tippgeste befindet sich innerhalb der Klasse TableViewCell. Wie bekomme ich den indexPath von dort? Ich weiß nur, dass ich den IndexPath von der UITableView innerhalb der UITableView Klasse erhalten kann, aber dann müsste ich eine andere Gestenerkenner auf die Bilder setzen, die falsch zu sein scheint ?! –

+1

Sie benötigen einen Delegaten, um ein Ereignis im View-Controller auszulösen, bei dem die Zelle berührt wurde. ViewController hat einen Verweis auf die Tabellenansicht und kann Ihnen den indexPath geben, indem Sie die Funktion tableview.indexPathForCell aufrufen –

Antwort

2
protocol TwoPicsTableViewCellDelegate{ 
    func image1Clicked(cell:TwoPicsTableViewCell) 
    func image2Clicked(cell:TwoPicsTableViewCell) 
} 

class TwoPicsTableViewCell: UITableViewCell { 

    var delegate:TwoPicsTableViewCellDelegate! 

    func checkPicTwo() { 

     firstImage.bouncing() 
     vote(voteForPic: firstImage) 

     if secondImage.layer.borderWidth != 0 { 
      secondImage.layer.borderWidth = 0 
     } 

     //delegate call 
     delegate.image1Clicked(self) 
    } 

    func checkPicOne() { 

     secondImage.bouncing() 

     if firstImage.layer.borderWidth != 0 { 
      firstImage.layer.borderWidth = 0 
     } 

     //delegate call 
     delegate.image2Clicked(self) 
    } 
} 

Im View-Controller entsprechen es:

class myViewController: UIViewController, TwoPicsTableViewCellDelegate{ 


    //implement delegate methods 

    func image1Clicked(cell:TwoPicsTableViewCell){ 
     let indexPath = tableview.indexPathForCell(cell) 
     print(indexPath) 
    } 

    func image2Clicked(cell:TwoPicsTableViewCell){ 
     let indexPath = tableview.indexPathForCell(cell) 
     print(indexPath) 
    } 


    func table cellForRowAt..........{ 
     let cell = table.dequeCellAt.......... as? TwoPicsTableViewCell 
     //Assign delegate 
     cell.delegate = self 
     ....... 
     ....... 

     return cell 

    } 

} 
+0

Vielen Dank! Ich werde es so schnell wie möglich versuchen! –

+0

der Delegat Aufruf gibt mir einen Fehler: "Verwendung der nicht aufgelösten Bezeichner 'Delegat'" .. –

+0

haben es in der Tabelle Zelle Klasse definiert, wie ich in der obigen Antwort erwähnt habe? 'var delegate: TwoPicsTableViewCellDelegate!' –

Verwandte Themen