2016-06-22 6 views
1
gesendet wurden

Ich verwende einen benutzerdefinierten Zelldelegaten, um eine Funktion aufzurufen, wenn eine Schaltfläche in der benutzerdefinierten Zelle gedrückt wird. Ich möchte dann das Bild der Schaltfläche zu einem bestimmten Bild abhängig von einer booleschen Variable der benutzerdefinierten Zellklasse ändern.Fehler EXC_BAD_ACCESS beim Zugriff auf Klassenvariablen, die von Funktion

Mir ist bewusst, wie ich dies ohne Delegation tun kann, aber ich möchte auch eine Warnmeldung anzeigen, wenn die Schaltfläche gedrückt wird, und ich kann das nicht innerhalb der benutzerdefinierten Zellklasse tun.

Das Problem, auf das ich stoße, ist, dass ich einen EXC_BAD_ACCESS Fehler habe, wenn ich versuche, auf die benutzerdefinierten Zelleneigenschaften innerhalb der Delegatfunktion zuzugreifen. Hier ist mein Code für meine benutzerdefinierte Klasse:

import UIKit 

protocol ProfileHeaderCellDelegate: class { 
    func follow(sender:ProfileHeaderCell) 
} 

class ProfileHeaderCell: UITableViewCell { 

var followTapped = false 
var delegate : ProfileHeaderCellDelegate! 

@IBOutlet var profilePic: UIImageView! 
@IBOutlet var followButton: UIButton! 
@IBAction func followButtonTapped(sender: AnyObject) { 

     delegate?.follow(self) 
} 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 

    self.profilePic.layer.cornerRadius = self.profilePic.frame.size.width/2; 
    self.profilePic.clipsToBounds = true; 
} 

@IBOutlet var albumArt: UIImageView! 
override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
} 

}

Und hier ist der Funktionsaufruf aus der Tabelle View-Controller, die die Zelle enthält:

func follow(sender: ProfileHeaderCell){ 
    if(sender.followTapped == false){ 
     sender.followButton.imageView?.image = UIImage(named: "img1") 
     sender.followTapped = true 
    }else if(sender.followTapped == true){ 

     let unfollowAlert = UIAlertController(title: "", message:"Would you like to unfollow this User?", preferredStyle: .Alert) 
     let unfollow = UIAlertAction(title: "Yes, Unfollow this User", style: .Destructive){(ACTION) in 

      print("unfollow tapped") 
      sender.followButton.imageView!.image = UIImage(named: "img2") 

     } 
     let cancel = UIAlertAction(title: "Cancel", style: .Cancel){(ACTION) in 

      print("cancel tapped") 
     } 

     unfollowAlert.addAction(unfollow) 
     unfollowAlert.addAction(cancel) 

     self.presentViewController(unfollowAlert, animated: true, completion: nil) 
    } 
} 

Die schlechte Zugriffsfehler tritt auf In dieser ersten Zeile der Delegiertenfunktion:

if(sender.followTapped == false){ 

Wie kann ich richtig zugreifen t Die Variable vom benutzerdefinierten Zellenobjekt?

Antwort

0

Ich erkannte, dass mein Fehler innerhalb meiner cellForRowAtIndexPath Methode war. Das Problem war, dass zusätzlich zu der Delegaten-Methode aufgerufen wird, wenn die Taste (durch eine IBAction in meiner benutzerdefinierten Zellklasse) abgehört wurde, hatte ich auch die folgende Zeile in der cellForRowAtIndexPath Methode:

cell1.followButton.addTarget(self, action: "follow:", forControlEvents: .TouchUpInside) 

Ich stelle mir den schlechten Zugang Es kam vor, weil irgendwie die gleiche "follow" -Methode aufgerufen wurde, aber von innerhalb des Hauptansicht-Controllers, was bedeutet, dass die Senderzelle niemals als Parameter übergeben wurde.