0

I already the TableView for displaying JSON Values from API. But the result of the click does not match the existing title, but it is worth the title from the previous click. More clearly see the picture

Picture

Code InfoViewCell.swift This code for cell in tableview

import UIKit

class InfoViewCell: UITableViewCell {
    @IBOutlet weak var imgInfo: UIImageView!
    @IBOutlet weak var lblInfo: UILabel!
    @IBOutlet weak var lblBerita: UILabel!


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

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

Code Info.swift this code for models

class Info {

    var id_informasi: Int?
    var tgl_informasi: String?
    var judul: String?
    var berita: String?
    var foto: String?

    init(id_informasi:Int?,judul: String?,berita: String?,foto: String?) {
        self.id_informasi = id_informasi
        self.judul = judul
        self.berita = berita
        self.foto = foto
    }
}

Code InfoViewController.swift

import UIKit
import Alamofire
import AlamofireImage

class InformasiViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet weak var tableInfo: UITableView!
    var activityIndicator:UIActivityIndicatorView = UIActivityIndicatorView()


    var infoes = [Info]()

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return infoes.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellInfo", for: indexPath) as! InfoViewCell

        //getting the hero for the specified position
        let inpo: Info
        inpo = infoes[indexPath.row]

        //displaying values
        cell.lblInfo.text = inpo.judul
        cell.lblBerita.text = inpo.berita

        //displaying image
        Alamofire.request(inpo.foto!).responseImage { response in
            debugPrint(response)

            if let image = response.result.value {
                cell.imgInfo.image = image
            }
        }

        return cell
    }

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {

        let info: Info
        info  = infoes[indexPath.row]

        //building an alert
        let alertController = UIAlertController(title: info.judul, message: "", preferredStyle: .alert)

        //the confirm action taking the inputs
        let confirmAction = UIAlertAction(title: "Enter", style: .default) { (_) in

        }

        //the cancel action doing nothing
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in }

        //adding action
        alertController.addAction(confirmAction)
        alertController.addAction(cancelAction)

        //presenting dialog
        present(alertController, animated: true, completion: nil)
    }



    override func viewDidLoad() {
        super.viewDidLoad()


        let defaultValues = UserDefaults.standard
        let token = defaultValues.string(forKey: "token")


        //the Web API URL
        let URL_GET_DATA = "https://api.landslidepad.com/api/admin_desa/informasi_penting?token=" + token!

        activityIndicator.center = self.view.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.style = UIActivityIndicatorView.Style.gray
        view.addSubview(activityIndicator)
        activityIndicator.startAnimating()
        //fetching data from web api
        Alamofire.request(URL_GET_DATA, method: .get).responseJSON
            {

                response in
                //printing response
                print(response)

                self.activityIndicator.stopAnimating()
                //getting the json value from the server
                if let result = response.result.value {

                    let jsonData = result as! NSDictionary

                    //if there is no error
                    if((jsonData.value(forKey: "message") as! String == "Sukses!")){

                        //getting the user from response
                        let user = jsonData.value(forKey: "values") as! NSArray

                        for i in 0..<user.count{

                            //adding hero values to the hero list
                            self.infoes.append(Info(
                                id_informasi: (user[i] as AnyObject).value(forKey: "id_informasi") as? Int,
                                judul: (user[i] as AnyObject).value(forKey: "judul") as? String,
                                berita: (user[i] as AnyObject).value(forKey: "berita") as? String,
                                foto: (user[i] as AnyObject).value(forKey: "foto") as? String
                            ))
                        }
                        //displaying data in tableview
                        self.tableInfo.reloadData()

                    }else{
                        let alert = UIAlertController(title: "Ada yang salah?", message: "Silahkan Ulangi Kembali!.", preferredStyle: .alert)

                        alert.addAction(UIAlertAction(title: "Yes", style: .default, handler: nil))
                        alert.addAction(UIAlertAction(title: "No", style: .cancel, handler: nil))

                        self.present(alert, animated: true)
                    }
                }
        }



        self.tableInfo.reloadData()
        // Do any additional setup after loading the view, typically from a nib.

        // Do any additional setup after loading the view.
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

I already tried to create func tableview didDeselectRowAt indexPath, but the value I want to display is not in line with my expectations. I will pass this value to the detailed view

Thanks

rmaddy
  • 314,917
  • 42
  • 532
  • 579

2 Answers2

2

When you click on a row, that row is selected — and the previous selected row is deselected. Well, you have implemented didDeselect, so the previous selected row is displayed. Instead, implement didSelect.

matt
  • 515,959
  • 87
  • 875
  • 1,141
0

instead of this

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {

    let info: Info
    info  = infoes[indexPath.row]

    //building an alert
    let alertController = UIAlertController(title: info.judul, message: "", preferredStyle: .alert)

    //the confirm action taking the inputs
    let confirmAction = UIAlertAction(title: "Enter", style: .default) { (_) in

    }

    //the cancel action doing nothing
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in }

    //adding action
    alertController.addAction(confirmAction)
    alertController.addAction(cancelAction)

    //presenting dialog
    present(alertController, animated: true, completion: nil)
}

please use this

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let info: Info
    info  = infoes[indexPath.row]

    //building an alert
    let alertController = UIAlertController(title: info.judul, message: "", preferredStyle: .alert)

    //the confirm action taking the inputs
    let confirmAction = UIAlertAction(title: "Enter", style: .default) { (_) in

    }

    //the cancel action doing nothing
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in }

    //adding action
    alertController.addAction(confirmAction)
    alertController.addAction(cancelAction)

    //presenting dialog
    present(alertController, animated: true, completion: nil)
}
Nikunj Kumbhani
  • 3,758
  • 2
  • 26
  • 51
Keyur
  • 39
  • 5