how to show UIAlertController in a custom UITableViewCell in button click using swift code?

11,296

Solution 1

i found a solution. following are code for above question. write the following code for button in viewcontroller where table view are present.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let deerNameCell: CustomCellDeerCalls = tableView.dequeueReusableCellWithIdentifier("Cell") as CustomCellDeerCalls
    let deercallcell=arrayOfCallsName[indexPath.row]

    deerNameCell.DeerCallNameLabel.text=deercallcell.callName
    deerNameCell.playButton.tag=indexPath.row
    deerNameCell.detialsInfoButton.tag=indexPath.row
    deerNameCell.detialsInfoButton.addTarget(self, action: "showAlert:", forControlEvents:UIControlEvents.TouchUpInside)

    return deerNameCell

}

and the funtion for alert in the same view controller:

   func showAlert(sender:UIButton!)
{
    println(sender.tag)
    let deercallcell=arrayOfCallsName[sender.tag]
    var alert = UIAlertController(title: deercallcell.callName, message: arrayOfDetialsInfoDeerCalls[sender.tag], preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

    self.presentViewController(alert, animated: true, completion: nil)

}

Solution 2

You are trying to call presentViewController on a UITableViewCell but this method is a member of a UIViewController instead.

Here is my suggestion:

1) Create a CustomCellDeerCallsDelegate protocol, ie.:

protocol CustomCellDeerCallsDelegate {
    func showAlert(title:String, message:String);
}

2) Add a weak property to your custom cell:

var delegate:CustomCellDeerCallsDelegate?

3) In your clickDetialsInfoButton function call a method on a delegate:

self.delegate?.showAlert("DDDDD", message: arrayOfDetialsInfoDeerCalls[sender.tag])

4) Add a protocol implementation to a ViewController that hosts the table view that displays the cell.

5) In a protocol implementation of showAlert function - show the alert:

func showAlert(title:String, message:String){
    var alert = UIAlertController(title: "dddddd", message: arrayOfDetialsInfoDeerCalls[sender.tag], preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

    self.presentViewController(alert, animated: true, completion: nil)

}
Share:
11,296
ibad ur rahman
Author by

ibad ur rahman

Senior Software Engineer At Satsuma Droid. Work in iOs, Android, Windows phone and wordpress.

Updated on June 05, 2022

Comments

  • ibad ur rahman
    ibad ur rahman almost 2 years

    i want to show UIAlertController in a custom UITableViewCell in a button click. but i can't find any way for this. please see the below code that i have try. enter image description here

    this code give error in UITableViewCel, that is shown in above picture. please help me.the whole class code is below:

    class CustomCellDeerCalls: UITableViewCell {
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    
    @IBOutlet weak var playButton: UIButton!
    @IBOutlet weak var detialsInfoButton: UIButton!
    
    @IBOutlet weak var DeerCallNameLabel: UILabel!
    
    var arrayOfDetialsInfoDeerCalls: [String]=["This sound is a doe's way of locating other deer of her family group . This call can be used all year long.",
    "Grunts are a doe's way of saying come here , also to call her fawns at feeding time . It is critical to keep the call soft as a loud grunt is too aggressive of a call.",
    "A buck grunt is a deeper pitch than a doe grunt , it means the same thing . The older the buck the deeper the tone. ",
    "As the buck chases the doe as the rut approaches he is frustrated, and makes a series of soft grunts while trailing her. It's the bucks way of asking her to stop so he can be breed with her.",
    "This sound's a lot like a calf bawl , but it is a series of buck bleats. This signals the bucks desire for company.",
    "This is a non aggressive and social behaviour that all bucks do after shedding their velvet . This is when the bucks learn who can whip the other . This process does not prevent serious fights later on during the rut.",
    "This is the sound that a buck makes during the courtship when the doe stops running , but won't let the buck breed her. It's a non aggressive and frustration call by him.",
    "This is the sound that a Doe makes to signal that her breeding time is near.",
    "This is the sound that a Doe makes to signal that she ready to breed RIGHT NOW.",
        "Deer make this sound to intimidate other deer and prevent fights. This call is often made by a rut- crazed buck when confronted with a rival. This sound can send smaller buck running from the area.",
    "Another rut crazed Bucks sound to intimidate other deer and prevent fights when confronted with a rival. This sound can also send smaller buck running from the area.",
    "This is a short aggressive rattling sequence to possibly lure in less aggressive, but curious buck, as well as the local dominant whitetail buck of the area. To make this sound like a real fight sniffs, wheezes and grunts have also been thrown in for added effect."]
    
    
    var arrayOfDeerSoundsCall: [String]=["CONTACT","doegrunt","bkgrunt","tend","bawl","spar","rage","estrusb","bellow","sniff","wheeze","rattle"]
    

    // var arrayOfCallsName: [String]=[""]

    @IBAction func clickDetialsInfoButton(sender: AnyObject) {
    
       var alert = UIAlertController(title: "dddddd", message: arrayOfDetialsInfoDeerCalls[sender.tag], preferredStyle: UIAlertControllerStyle.Alert)
       alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
    
    self.presentViewController(alert, animated: true, completion: nil)
        //sender.sup
       //
    }
    
    var audioPlayer = AVAudioPlayer()
    
    
    @IBAction func clickplayButton(sender: AnyObject) {
    
        println(sender.tag)
    
        var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(arrayOfDeerSoundsCall[sender.tag], ofType: "wav")!)
        println(alertSound)
    
        // Removed deprecated use of AVAudioSessionDelegate protocol
        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)
    
        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    
    
    
    }
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    
        // Configure the view for the selected state
    }
    func setCell(callName: String){
    
    self.DeerCallNameLabel.text=callName
    
    }
    

    }

  • ibad ur rahman
    ibad ur rahman over 9 years
    i try this one but not working. alert is not shown on button click. thanks for answer.
  • magohamote
    magohamote about 8 years
    @IbadUrRahman To make this work you should set your delegate: 6) in your cellForRowAtIndexPath function: deerNameCell.delegate = self